使用“槽”使用ManyToManyRelationship

时间:2018-07-11 15:13:29

标签: django django-models

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

Person与事件之间存在多对多的联系,一个Person可以参加多个事件,一个Event上有多个Persons正在参加。

一个人不一定要参加活动,活动可以是空的。

我可以在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. 如果事件或人物被删除,“槽”模型记录是自动删除还是需要手动执行操作?

1 个答案:

答案 0 :(得分: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,因此删除事件或人员后,出席者将消失。