Skip to main content
 首页 » 编程设计

python之具有两个字段的独特组合的django模型

2025年05月04日22over140

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

我需要使 creator+ 名称唯一,以便我可以调用

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 还是我必须执行数据迁移吗?

请您参考如下方法:

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

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

Case insensitive unique model fields in Django?

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

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