Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Django中强制执行字段的唯一组合_Django_Django Models_Foreign Key Relationship - Fatal编程技术网

在Django中强制执行字段的唯一组合

在Django中强制执行字段的唯一组合,django,django-models,foreign-key-relationship,Django,Django Models,Foreign Key Relationship,有一个模型可以链接多个项目,如: from django.db import models class MyModel(models.Model): name = models.CharField(max_length=100) def __unicode__(self): return self.name class MyModelItem(models.Model): TYPE_CHOICES = ( ('A', 'A NAME'

有一个模型可以链接多个项目,如:

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=100)

    def __unicode__(self):
        return self.name

class MyModelItem(models.Model):
    TYPE_CHOICES = (
        ('A', 'A NAME'),
        ('B', 'B NAME'),
        ('C', 'C NAME')
    )
    name = models.CharField(max_length=100)
    model = models.ForeignKey(MyModel, related_name='items')
    item_type = models.CharField(max_length=1, choices=TYPE_CHOICES)

    def __unicode__(self):
        return self.name
要求是:对于
MyModel
的每个记录,不允许有多个
MyModelItem
记录具有相同的
项目类型,这意味着如果我有:

from myproj.myapp.models import MyModel, MyModelItem

m1 = MyModel.objects.create(name='M1')

MyModelItem.objects.create(name='Item1', model=m1, item_type='A')
然后,我无法将另一条具有相同类型“A”的记录添加到
m1

我的一个解决方案是在
MyModelItem
中这样做:

    ...
    def save(self, *args, **kwargs):
        if self.model.items.filter(item_type=self.item_type):
            raise IntegrityError("%s already have a item with type %s" % (self.model, self.item_type))
        super(MyModelItem, self).save(*args, **kwargs)

但这并不能保护db级别上的限制。可以直接用SQL添加这些不允许的记录,这会破坏我的应用程序。Django中是否有实现此要求的方法?类似于
unique\u-together

你明白了,
unique\u-together
就是这样做的。简单到:

class MyModelItem(models.Model): 
    ...
    name = models.CharField(max_length=100)
    model = models.ForeignKey(MyModel, related_name='items')
    item_type = models.CharField(max_length=1, choices=TYPE_CHOICES)

    class Meta:
        unique_together = ('model', 'item_type')

我想不起来为什么我认为“独一无二”不能满足我的要求,太愚蠢了。感谢您的回答和对我的问题的更新,以纠正我糟糕的英语。值得注意的是,首先需要迁移,然后将
unique\u添加到一起
约束,然后再次运行迁移。