mysql Django,多对多关系,如何插入表中所有键的值?

92vpleto  于 2023-02-03  发布在  Mysql
关注(0)|答案(1)|浏览(123)

我有3个模型公司,折扣和CompanyDiscountRelation如下:

class Company(models.Model):
    name = models.CharField(max_length=150)

    def __str__(self):
        return self.name

class Discount(models.Model):
    name = models.CharField(max_length=150)
    discount_value = models.IntegerField()

    def __str__(self):
        return self.name

class DiscountCompanyRelation(models.Model):
    company= models.ForeignKey(Company, on_delete=models.CASCADE)
    discount = models.ForeignKey(Discount, on_delete=models.CASCADE)
    is_active = models.BooleanField(default=True)

我知道如何将以前创建的折扣分配给一家公司。我通过DiscountCompanyRelationForm执行此操作,并从表单列表中选择公司。但我希望通过单击将折扣分配给所有公司。如何执行此操作?我尝试通过以下方式获取所有ID:Company.objects.values_list('pk', flat=True)并遍历它们,但我不认为这是应该做的,我有问题,以保存表单:form.save()
我尝试了一整天,但是现在我放弃了。抱歉,如果这是基础知识的话。我已经和django一起工作了几天了。

h79rfbju

h79rfbju1#

如果我理解了这个问题,那么您希望在Company表中选择公司的子集,并应用特定的Discount。
第一个可以是ModelMultipleChoiceField,第二个可以是ModelChoiceField,将它们放在一个表单中,并为公司和可选择的折扣设置相应的查询集,然后在表单验证后应用折扣:

discount = form.cleaned_data['discount'] 
companies = form.cleaned_data['companies']
for company in companies:
    relation = DiscountCompanyRelation(
        discount = discount,
        company = company,
        is_active = # whatever you need
    )
    relation.save()

你需要考虑当一个折扣被应用到一个已经有折扣的公司时会发生什么。你将在上面的循环中放置代码来检查和实现适当的操作。
我强烈建议在ForeignKey上指定一个related_name,而不是依赖Django自动生成的任何东西。
您可能还需要查看ManyToManyField模型的“through”选项,因为这是另一种创建相同DB结构的方法,但会为您提供Django的ManyToMany支持代码。

相关问题