关于隐式关系的Django prefetch_related

时间:2014-04-11 12:25:51

标签: python django django-queryset django-database

让我们说我正在制作地址簿应用。

class AddressBookEntry(models.Model):
    address_book = models.ForeignKey(AddressBook)
    name = models.CharField()
    email = models.EmailField()

class User(models.Model):
    name = models.CharField()
    email = models.EmailField()

这两个对象都有一个电子邮件字段。现在我想找到给定的所有通讯录 用户出现在。所以我在用户上创建一个方法

    def entries(self):
        return AddressBookEntry.objects.filter(email=self.email)

工作正常,但是当我提取一些用户时,我需要为每个用户执行一次数据库查询。我' d 喜欢User.objects.all().prefetch_related('entries'),但这不起作用entries是一个 方法,而不是ForeignKey。

所以 -

  • 有没有办法以某种方式告诉django这里没有明确的关系 带有直通表的多对多字段,所以我可以使用select_related?
  • 或者在我获取用户时是否有办法在对象之间进行JOIN(这将是一个 我认为交叉加入,但它会比我现在拥有的更好。)

1 个答案:

答案 0 :(得分:0)

更多'Django'的方法是拥有一个明确的关系字段:

class AddressBookEntry(models.Model):
    address_book = models.ForeignKey(AddressBook)
    name = models.CharField()
    user = models.ForeignKey("User", related_name="entries")

class User(models.Model):
    name = models.CharField()
    email = models.EmailField()

User.objects.all().select_related('entries')