带有大桌子的Django M2M

时间:2018-07-13 14:34:27

标签: django django-forms

我有一个典型的M2M场景,其中促销活动与我们的零售商有关。但是,我们有大量的零售商(超过1万个),因此我不能使用常规的多选小部件。

我打算做的是创建一个“活动”实例页面,并带有一个“零售商”子页面,该页面将列出所有当前与该活动相关的零售商。此外,每个零售商旁边都会有一个“删除”复选框,因此如有必要,可以将其从列表中删除。 (自然,我还会有另一个搜索/结果页面,用户可以在其中选择要添加到列表中的零售商,但是我敢肯定自己可以解决这个问题。)

有人不确定我对正确的方向有什么看法,因为我不确定从这里出发。直接操纵app_activity_associated_retailers表似乎很明显,但是我认为我不能使用现有函数来做到这一点。有没有这样做的模式。

class Activity(models.Model):
    budget = models.ForeignKey('Budget')
    activity_type = models.ForeignKey('ActivityType')
    amount = models.DecimalField(max_digits=8, decimal_places=2)
    associated_retailers = models.ManyToManyField('Retailer', related_name='associated_retailers')

class Retailer(models.Model):
    name = models.CharField(max_length=50)
    address01 = models.CharField(max_length=50)
    address02 = models.CharField(max_length=50, blank=True)
    postcode = models.CharField(max_length=5)
    city = models.CharField(max_length=20)

1 个答案:

答案 0 :(得分:6)

所有ManyToManyField都具有through模型,无论您是否自己定义。在您的情况下,它将具有一个id,一个activity字段和一个retailer字段。您可以使用Activity.associated_retailers.through访问该表-一种“显而易见的”方法是将其公开为“模型”之类的

ActivityRetailer = Activity.associated_retailers.through

您现在可以像对待所有Django模型一样操纵这些关系,因此可以生成类似的查询集

retailer_records_for_activity = ActivityRetailer.objects.filter(activity_id=1234)

...,您还可以为这些伪模型创建模型模板集(如果已配置,请完成delete复选框)。