3

以下のようなdjangoモデルがあります

class MySubject(models.Model):
    name=models.CharField(unique=True,max_length=50)
    description=models.TextField(blank=True)
    slug=models.SlugField(editable=False)

    class Meta:
        verbose_name_plural="MySubjects"

    def __unicode__(self):
        return self.name

    def save(self,*args,**kwargs):
        self.name=self.name.strip()
        self.slug=slugify(self.name)
        super(MySubject,self).save(*args,**kwargs)

    @models.permalink
    def get_absolute_url(self):
        return ('subject_detail',(),{'slug':self.slug})

呼び出すことができるように、作成者+の名前を一意にする必要があります

subject,status=MySubject.objects.get_or_create(name__iexact=name.strip(),creator= request.user,defaults={'name':name,'description':name,'creator':request.user})

これを行う正しい方法は次のとおりですか?

class MySubject(models.Model):
        name=models.CharField(max_length=50)
        creator = models.ForeignKey(User,null=True)
        description=models.TextField(blank=True)
        slug=models.SlugField(editable=False)

        class Meta: 
            verbose_name_plural="MySubjects"
            unique_together = ('name', 'creator',)
         ...

変更を行った後、migration使用する必要があると思います..一人で行う必要がありますか?southschemamigrationdatamigration

4

1 に答える 1

2

一意の制約を追加することは、スキーマの移行です。ただし、整合性エラーの原因となる既存のデータがある場合は、データの移行も必要になります。

大文字と小文字を区別しない一意の制約が本当に必要な場合は、もう少し複雑です。

Djangoの大文字と小文字を区別しない一意のモデルフィールド?

参照: https://code.djangoproject.com/ticket/14564

常にget_or_createiexact を使用している場合は、問題ない可能性があります。ただし、「foo」と「fOo」という名前の 2 つを手動で作成しないでください。これは許可され、get_or_create を呼び出すと MultipleObjectsReturned が発生するためです。私の考えが正しければ。

于 2012-12-28T08:21:07.897 に答える