Django使用直通表自动保存m2m关系

时间:2016-07-28 16:49:33

标签: python django

我在Django中的ServersProducts之间有一个m2m关系,其中有一个名为ServerProducts的直通表。

class ServerProduct(TimeStampedModel):
     # Additional fields may be required in the future
     server = models.ForeignKey('Server', on_delete=models.CASCADE)
     product = models.ForeignKey('Product', on_delete=models.CASCADE)


class Server(TimeStampedModel):
    name = models.CharField(max_length=35)
    # ...
    products = models.ManyToManyField('Product', through='ServerProduct',
                                      related_name='products', blank=True)


class Product(TimeStampedModel):
    name = models.CharField(max_length=45, unique=True)
    # ...
    servers = models.ManyToManyField(
        'Server', through='ServerProduct', related_name='servers')

在我看来,我有一个表单,允许用户创建服务器,并从要关联的服务器的所有产品列表中进行选择。

为了在每次保存时创建ServerProduct个对象(用于直通表),我必须在save()内编写以下代码。

class ServerForm(forms.ModelForm):
    class Meta:
        model = Server
        fields = '__all__'

    def save(self, commit=True):
        instance = super(ServerForm, self).save(commit=False)
        instance.save()
        if instance.products.count():
            instance.products.clear()
        for product in self.cleaned_data['products']:
            ServerProduct.objects.create(server=instance, product=product)
        return instance

我希望能够为CreateUpdate视图重复使用该表单。因此,为什么我必须检查当前服务器是否与任何产品相关联,然后执行instance.products.clear()。如果用户取消选择它们,请确保删除任何以前的产品。

这整个过程都是不必要的,特别是当我读了很多关于Django的内置form.save_m2m()方法的时候。我的问题是,有没有更简单的方法来实现我使用Django内置的功能?

0 个答案:

没有答案