我有一个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
进行south
。我必须单独schemamigration
或我必须做datamigration
?
答案 0 :(得分:1)
添加唯一约束是架构迁移。但是,如果您有可能导致完整性错误的现有数据,则还需要进行数据迁移。
如果你真的想要不区分大小写的唯一约束,那就更复杂了:
Case insensitive unique model fields in Django?
另见:https://code.djangoproject.com/ticket/14564
如果你总是使用iexact get_or_create
,你可能没问题。但是,你不应该手动创建两个名称为" foo"并且" fOo",因为,这将是允许的,然后你对get_or_create的调用将导致MultipleObjectsReturned ..如果我正确思考。