django - 使用“低谷”使用 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) 作为表单集,让同一表单/页面上的用户将多个事件链接到一个人。
如果删除了一个事件或一个人,“槽”模型记录是自动删除还是需要手动执行?
解决方案
像这样的东西应该工作。
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
已设置,当事件或人员被删除时,考勤将消失。
推荐阅读
- sql - 如何在另一列之前找到最新日期的行?
- android-studio - 无法识别的 Android Studio 版本
- css - css动画向左移动,重新出现在右侧并继续向左
- amazon-ec2 - WSO2 API 管理器 - TypeError 无法在 API 中获取尝试
- csv - 将 CSV 加载到 Apache Beam 时如何处理换行符?
- vulkan - 如何使 VK_LAYER_KHRONOS_validation 可用?
- php - header("Location:") 函数在实时服务器上不起作用
- java - 如何阻止日食如此频繁地暂停?
- reactjs - 如何在反应中将大文件上传到cloudinary
- python - pip3 是否安装了 psycopg2,但无法导入 Visual Studio 代码