我有两个模型,它们相互交叉引用。 这是model.py:
class Backpack(models.Model):
capacity = models.PositiveSmallIntegerField(default=0),
list_of_items = = models.ManyToManyField('Items', related_name='items', blank=True)
class Item(models.Model):
name = models.CharField(_('name'), max_length=250)
list_of_backpacks = models.ManyToManyField('Backpack', related_name='backpack', blank=True)
我通常会使用第三种模型来存储这种关系(IntemsInBackpack;我想它将使它成为3NF),但是我在规范中得到了两个m2m字段。 在许多领域都采用正确的方法吗?还是我应该采取其他方式?
我可以序列化模型并使用Forms清理用户输入(由于它们起作用,因此我省略了这些内容)。
最初,我尝试限制Items
中Backpack
中clean()
的数量。它以相应的形式工作,例如BackpackForm,正确返回ValidationError,但是从某种意义上说,这些更改是局部的,它们仅显示在Backpack对象中,而不反映在Item中(list_of_backpacks
保持不变)。
我已经找到了一些针对单一对象m2m引用的解决方案(为DRF定义了create
和update
函数),但我感到困惑,无法正确应用此方法。
我的实现:
class ItemForm(forms.ModelForm):
def save(self, commit=True):
item = super(ItemForm, self).save(commit=False)
backpacks = self.cleaned_data.get('list_of_backpacks')
for backpack in backpacks:
if backpack.capacity > item.list_of_backpacks.count():
raise ValidationError('Maximum ' + str(backpack.capacity) + ' items allowed in the backpack!')
self.save_m2m()
if commit:
item.save()
return item
但是,这并不能防止在背包中保存过多的物品,也不能防止在另一个Object中实际显示已保存的信息。
我不确定这段代码是否应该在Forms或Serializers中(都看到了这两种方法)。最佳做法是什么?