我在Django中的Servers
和Products
之间有一个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
我希望能够为Create
和Update
视图重复使用该表单。因此,为什么我必须检查当前服务器是否与任何产品相关联,然后执行instance.products.clear()
。如果用户取消选择它们,请确保删除任何以前的产品。
这整个过程都是不必要的,特别是当我读了很多关于Django的内置form.save_m2m()
方法的时候。我的问题是,有没有更简单的方法来实现我使用Django内置的功能?