反转唯一的通用外键(并返回一个对象而不是相关管理器)

2024-04-24

我有一个具有独特通用外键关系的模型:

class Contact(models.Model):
    ...
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

    class Meta:
         unique_together = ('content_type', 'object_id',)

意思是一个Contact只能属于一个对象。通常,当我想扭转关系时我可以这样做

class Person(models.Model):
    ...
    contacts = generic.GenericRelation(Contact)

并打电话person.contacts.all()会给我所有的对象。因为只有一个Contact在我的情况下将永远被返回,是否有更好的方法来反向访问该对象?

附注我可以写person.contact.all()[0]但必须有一个更清洁的方法


好吧,查看 Chris 评论中的问题很有帮助,我编写了一个 mixin 来使用快速查找返回对象(应该缓存):

class ContactMixin(object):
    @property
    def contactcard(self):
        ctype = ContentType.objects.get_for_model(self.__class__)
        try:
            contact = Contact.objects.get(content_type__pk = ctype.id, object_id=self.id)
        except Contact.DoesNotExist:
            return None 
        return contact

以及此人:

 class Person(ContactMixin, models.Model):
     ...

现在我可以打电话

myperson.contactcard.phone_number 

我暂时不会接受,因为可能还有其他建议

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反转唯一的通用外键(并返回一个对象而不是相关管理器) 的相关文章

随机推荐