Django M2M带有一张大桌子

alj*_*alj 5 django django-forms

我有一个典型的M2M场景,促销活动与我们的零售商有关.但是我们有大量零售商(超过10k),因此我无法使用普通的多选小部件.

我打算做的是拥有一个带有"零售商"子页面的"活动"实例页面,该子页面上有一个表格,列出了当前与该活动相关的所有零售商.此外,每个零售商旁边都会有一个"删除"复选框,以便在必要时将其从列表中删除.(当然,我还有另一个搜索/结果页面,用户可以选择他们想要添加到列表中的零售商,但我相信我可以自己解决这个问题).

有人能指出我关于模型和模板工厂的正确方向,因为我不知道从哪里开始.直接操作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)
Run Code Online (Sandbox Code Playgroud)

AKX*_*AKX 6

无论你是否自己定义一个模型,所有人ManyToManyField都有一个through模型.在你的情况下,它将有id一个activity字段和一个retailer字段.您可以访问该表Activity.associated_retailers.through- 一种"明显"的方式是将其公开为"模型"之类的

ActivityRetailer = Activity.associated_retailers.through
Run Code Online (Sandbox Code Playgroud)

你现在可以操纵这些关系,就像它们是任何ol'Django模型一样,所以你可以生成像这样的查询集

retailer_records_for_activity = ActivityRetailer.objects.filter(activity_id=1234)
Run Code Online (Sandbox Code Playgroud)

...并且您还可delete以为这些伪模型创建模型表单集(如果这样配置,则使用该复选框完成).