0

我意识到 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

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

4

2 回答 2

0

请看这篇文章Django : select_related with ManyToManyField

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

于 2013-07-17T20:35:48.710 回答
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

于 2016-10-17T01:20:21.520 回答