首页 > 解决方案 > 使用“低谷”使用 ManyToManyRelationship

问题描述

我有 2 个实体/模型人物和事件。

Person 和 Event 之间存在多对多的连接,一个 Person 可以参与多个事件,一个 Event 上有多个 Person 正在进行。

一个人不必参加一个事件,一个事件可以是空的。

我可以这样做Django

class Person(models.Model):

name = models.CharField(max_length=100)
event = models.ManyToManyField(Publication)  

这将创建一个相关表:

id | person_id | event_id

但我需要一个人拥有更多与事件相关的属性,除了键等Person's event number, Person's booth

在 Django 文档中,我发现了“槽”模型。

不清楚(未找到)与使用表单创建/更新/删除有关,所以我需要一些示例以及查询集如何工作;

例子:

  1. 在表单中,我想从列表中选择和事件并与人员相关联,并在表单中填写人员的事件编号、人员的展位等。

  2. 我如何使用 1) 作为表单集,让同一表单/页面上的用户将多个事件链接到一个人。

  3. 如果删除了一个事件或一个人,“槽”模型记录是自动删除还是需要手动执行?

标签: djangodjango-models

解决方案


像这样的东西应该工作。

class Person(models.Model):
    name = models.CharField(max_length=100)
    events = models.ManyToManyField('Event', through='Attendance')


class Event(models.Model):
    attendees = models.ManyToManyField('Person', through='Attendance')


class Attendance(models.Model):
    person = models.ForeignKey(Person, related_name='attendances', on_delete=models.CASCADE)
    event = models.ForeignKey(Event, related_name='attendances', on_delete=models.CASCADE)
    booth = models.CharField(max_length=10)

然后,您可以简单地为Attendance对象创建表单/表单集。您可以通过 访问用户的活动p.events.all(),或通过 访问他们的出席(带有这些额外信息)p.attendances.all()e.attendees.all()同样,您可以通过等查看参加活动的所有人。

由于on_delete=models.CASCADE已设置,当事件或人员被删除时,考勤将消失。


推荐阅读