简体   繁体   English

具有两个字段的独特组合的Django模型

[英]django model with unique combination of two fields

I have a django model as below 我有一个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})

I need to make the creator+ name unique ,sothat I can call 我需要使creator +名称唯一,以便我可以调用

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

Is the following ,the right way to do this? 以下是正确的方法吗?

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',)
         ...

I guess I have to do a migration using south after making the change..Do I have to do schemamigration alone or do I have to do a datamigration ? 我想我必须做一个migration使用south使得change..Do我必须做后schemamigration单独或做我必须做一个datamigration

Adding a unique constraint is a schema migration. 添加唯一约束是模式迁移。 However, if you have existing data that would cause an integrity error, you would need a data migration, as well. 但是,如果您现有的数据可能导致完整性错误,则也需要进行数据迁移。

If you really want case-insensitive unique constraint, it's a little more complicated: 如果您确实需要不区分大小写的唯一约束,则要复杂一些:

Case insensitive unique model fields in Django? Django中不区分大小写的唯一模型字段?

see also: https://code.djangoproject.com/ticket/14564 另请参阅: https : //code.djangoproject.com/ticket/14564

If you always use get_or_create with iexact, you may be ok. 如果您始终将get_or_create与iexact get_or_create使用,则可能会好的。 But, you should not manually create two with name as "foo" and "fOo", because, this would be allowed and then your call to get_or_create would cause a MultipleObjectsReturned .. if I'm thinking correctly. 但是,您不应手动创建名称分别为“ foo”和“ fOo”的两个,因为这将被允许,然后,如果我正确思考,对get_or_create的调用将导致MultipleObjectsReturned..。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM