Django QuerySet:除了一个unique_together参数之外,还有多对多的select_related功能?

时间:2013-07-17 20:27:38

标签: python django django-queryset

我意识到select_related仅适用于外键和一对一关系,但似乎应该有一种简单的,类似select_related的方式来连接多对多关系,这些关系是唯一的,只要一个给出了unique_together参数。

class User(models.Model):
  article_access_set = models.ManyToManyField(Article,
      through='UserArticleAccess', related_name='user_access_set')
  # User Information ...

class Article(models.Model):
  # Article Information ...

class UserArticleAccess(models.Model):

  user = models.ForeignKey(User)
  article = models.ForeignKey(Article)

  # UserArticleAccess Information: flags, liked, last_access_time, ... 

  class Meta:
      unique_together = ('user', 'article')

我正在寻找一种神奇的方法:

qs = Article.objects.all().magical_select_related(select={
    'user_access_set': {'user': request.user}})

print qs[0].user_access_set
# <UserArticleAccess ...>
print qs[1].user_access_set # No Access
# None

或者也许:

qs = Article.objects.all().magical_select_related(select = {
    'user_access_set': {'user': request.user}},
  as = {'user_access_set': 'user_access'})

print qs[0].user_access
# <UserArticleAccess ...>
print qs[1].user_access # No Access
# None

有没有办法做到这一点? (或者这不应该以这种方式或类似方式实现的原因?)

2 个答案:

答案 0 :(得分:0)

请看这篇文章Django : select_related with ManyToManyField

prefetch_related()可以在python中加入数据。

答案 1 :(得分:0)

使用Django 1.10,您可以使用django.db.models.fields.related.ForeignObject类(它不是公共API)。

https://groups.google.com/forum/#!topic/django-users/pGGHKb4Y8ZY

中查看有关此问题的对话

您可以在以下提交的tests/foreign_object/tests.py中看到示例: https://github.com/django/django/commit/80dac8c33e7f6f22577e4346f44e4c5ee89b648c