【问题标题】:django model with unique combination of two fields具有两个字段的独特组合的 django 模型
【发布时间】:2012-12-13 13:01:56
【问题描述】:

我有一个如下的 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',)
         ...

我想我必须在进行更改后使用south 执行migration。我必须单独执行schemamigration 还是必须执行datamigration

【问题讨论】:

    标签: python django migration


    【解决方案1】:

    添加唯一约束是架构迁移。但是,如果您有可能导致完整性错误的现有数据,您也需要进行数据迁移。

    如果你真的想要不区分大小写的唯一约束,那就有点复杂了:

    Case insensitive unique model fields in Django?

    另见:https://code.djangoproject.com/ticket/14564

    如果你总是使用 get_or_create 和 iexact,你可能没问题。但是,您不应该手动创建两个名称为“foo”和“fOo”,因为这是允许的,然后您对 get_or_create 的调用将导致 MultipleObjectsReturned .. 如果我的想法正确的话。

    【讨论】:

    • 感谢您的回复..我该如何进行数据迁移?我可以在 forwards() 方法中为创建者添加一个值,但是如何设置每条记录的唯一性?跨度>
    • 我知道这可能是异端;但是,我从来不喜欢南方,也不知道如何使用它。
    猜你喜欢
    • 2022-11-27
    • 1970-01-01
    • 2018-11-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2019-01-06
    相关资源
    最近更新 更多