从Django ORM中只获取一个相关对象

时间:2014-09-11 16:06:03

标签: python django django-models

以下是我处理的模型的精简版本:

class Contact(models.Model):
    contact_no = models.IntegerField(primary_key=True)
    email_address = models.CharField(max_length=60, null=True)

class ContactRole(models.Model):
    contact_no = models.ForeignKey(Contact, primary_key=True, db_column='contact_no')
    role_code = models.CharField(primary_key=True, max_length=16)
    role_scope_code = models.CharField(primary_key=True, max_length=16)

联系人可以并且几乎总是有很多ContactRoles。

我想要一个联系人列表,其中相关的ContactRole的role_scope_code是' foo'。我知道我可以使用:

Contact.objects.filter(contactrole__role_scope_code='foo')

想要的是,查询集中的每个联系人都有一个.contactrole属性。它将是具有< foo'的role_scope_code的ContactRole。相反,我得到一组在contact_no上匹配的所有ContactRoles,以便获取ContactRole的属性我有做这样的事情:

contacts = Contact.objects.filter(contactrole__role_scope_code='foo')
for contact in contacts:
    print contact.contactrole_set.filter(role_scope_code='foo')[0].role_code

我必须在role_scope_code上过滤两次!这看起来根本就不干了。我正在寻找的是一个查询,它允许我有一个像这样的集合:

contacts = Contact.objects.filter(contactrole__role_scope_code='foo')
for contact in contacts:
    print contact.contactrole.role_code

对于我的生活,我无法弄清楚如何告诉Django只返回与我应用于父对象的过滤器匹配的相关对象。

1 个答案:

答案 0 :(得分:1)

如果联系人只有一个contactrole,OneToOneField将解决此问题。 OneToOneField为您提供了您正在寻找的API。因此,不要使用ForeignKey而是使用OneToOneField