Django:访问ManytoMany中的额外字段(through=)

2024-04-25 13:50:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试访问我的ManytoMany字段中的purchaser字段。我使用through=添加了一些额外的字段。但是,似乎我只能访问事件对象,而不能访问额外的字段。有人能解释一下为什么吗?你知道吗

for selected_order in Order.objects.all():
    contact_exists = Contact.objects.filter(
        email=selected_order.email,
        event_related_fields=selected_order.event,
    )
    if contact_exists:
        contact = contact_exists.first()
        for x in contact.event_related_fields.all():
            print(x.purchaser)

型号.py

class Contact(TimeStampedModel):
    consent = models.BooleanField(verbose_name=_("Consent"))
    email = models.EmailField(verbose_name=_("Your email"))
    first_name = models.CharField(
        max_length=100,  # TODO Length must be same as for billing model
        verbose_name=_("First name"),
        null=True,
        blank=True,
    )
    last_name = models.CharField(
        max_length=100,  # TODO Length must be same as for billing model
        verbose_name=_("Last name"),
        null=True,
        blank=True,
    )
    events = models.ManyToManyField(Event, related_name='contacts')
    event_related_fields = models.ManyToManyField(
        Event, related_name='event_related_fields', through='EventRelatedFields'
    )
    organizer = models.ForeignKey(
        Organizer, on_delete=models.PROTECT, related_name='contacts'
    )  # PROTECT = don't allow to delete the organizer if contact exists

    class Meta:
        verbose_name = _("Contact")
        verbose_name_plural = _("Contacts")
        ordering = ('created',)
        unique_together = ('email', 'organizer')

    def __repr__(self):
        return "{}: {}".format(self.__class__.__name__, self)

    def __str__(self):
        return self.email


class EventRelatedFields(TimeStampedModel):
    event = models.ForeignKey(Event, on_delete=models.CASCADE)
    contact = models.ForeignKey(Contact, on_delete=models.CASCADE)
    lead = models.BooleanField(
        verbose_name='Lead', default=False
    )  # Contact who 'Signed Up'
    attendee = models.BooleanField(
        verbose_name='Attendee', default=False
    )  # Contact assigned to ticket
    purchaser = models.BooleanField(
        verbose_name='Purchaser', default=False
    )  # Contact made the order

    class Meta:
        unique_together = [['event', 'contact']]

Tags: nameselfeventfieldsforverbosemodelsemail
1条回答
网友
1楼 · 发布于 2024-04-25 13:50:44

出于某种原因,您正在定义两个多对多关系,并且使用相同的相关名称调用了其中一个event_related_fields。因此,您将其与直通表混淆。但是由于through表实际上是calledEventRelatedFields,因此您可以作为eventrelatedfields_set访问它的相关对象。你知道吗

您应该只有一个m2m,events

events = models.ManyToManyField(Event, through='EventRelatedFields', related_name='contacts')

类EventRelatedFields本身应该设置相关名称:

event = models.ForeignKey(Event, related_name='event_related_fields', on_delete=models.CASCADE)
contact = models.ForeignKey(Contact, related_name='event_related_fields, on_delete=models.CASCADE)

现在你可以做:

for x in contact.event_related_fields.all():
    print(x.purchaser)

相关问题 更多 >

    热门问题