Skip to main content
 首页 » 编程设计

python之Django:访问 ManytoMany 中的额外字段(通过=)

2024年09月03日30cmt

我正在尝试访问我的 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']] 

请您参考如下方法:

您出于某种原因定义了两个多对多关系,并且您已将其中之一称为 event_related_fields,并具有相同的相关名称。结果,您将其与直通表混淆了。但由于直通表实际上称为 EventRelatedFields,因此您可以将其相关对象访问为 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)