gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:39:32 24 4
gpt4 key购买 nike

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

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

关于django - 在 Django 中强制执行唯一的字段组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23137420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com