交叉引用很多字段而不保存更改Django RF

时间:2019-06-23 12:33:26

标签: django-models django-rest-framework django-forms django-serializer

我有两个模型,它们相互交叉引用。 这是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清理用户输入(由于它们起作用,因此我省略了这些内容)。 最初,我尝试限制ItemsBackpackclean()的数量。它以相应的形式工作,例如BackpackForm,正确返回ValidationError,但是从某种意义上说,这些更改是局部的,它们仅显示在Backpack对象中,而不反映在Item中(list_of_backpacks保持不变)。

我已经找到了一些针对单一对象m2m引用的解决方案(为DRF定义了createupdate函数),但我感到困惑,无法正确应用此方法。

我的实现:

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中(都看到了这两种方法)。最佳做法是什么?

0 个答案:

没有答案