有一个模型可能有多个项目链接到它,比如:
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
的记录具有相同的item_type
,这意味着如果我有:
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)
但这并不能保护数据库级别的限制。可以直接用SQL添加这样不允许的记录,这可能会破坏我的应用程序。有没有一种方法可以在Django中实现这个需求?类似unique_together
的东西?
你明白了,unique_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')