【问题标题】:Django queryset annotate using parent's fieldDjango 查询集使用父字段进行注释
【发布时间】:2014-10-23 19:39:41
【问题描述】:

我正在尝试在注释中引用一个字段,就像 F() 对象所做的那样。

# Getting users in this particular Group (using GroupMediator to also get "joined" date)
GroupMediator.objects.filter(group=group).annotate(
   # GroupPosition is a user's title within a group, like "treasurer".
   position=GroupPosition.objects.filter(group=group, recipients=F('member')))

问题: F('member')GroupPosition 中查找“成员”字段,但我想从GroupMediator 中获取“成员”字段。

我试图在获取所有成员的同一查询中获取每个成员在组中的位置。我正在努力提高效率,因此我不必使用 for 循环并查询每个成员来获取他们的位置。

如果可能,我想避免使用原始查询。我被卡住了。

型号:

class Group(models.Model):
    title = models.CharField(_("title"), max_length=60, blank=False)
    members = models.ManyToManyField(User, related_name='member_of_groups', verbose_name=_("members"), blank=True, through='GroupMediator')

class GroupMediator(models.Model):
    member = models.ForeignKey(User, related_name="group_mediators", verbose_name=_("member"), blank=False, editable=False)
    group = models.ForeignKey(Group, related_name="group_mediators", verbose_name=_("group"), blank=False, editable=False)
    joined = models.DateTimeField(_("created"), auto_now_add=True, editable=False)

class GroupPosition(models.Model):
    # This is its own model so many different custom positions can be created for each group.
    group = models.ForeignKey(Group, related_name="group_positions", verbose_name=_("group"), blank=False, editable=False)
    recipients = models.ManyToManyField(User, related_name='received_group_positions', verbose_name=_("recipients"), blank=True)
    title = models.CharField(_("title"), max_length=60, blank=False)

谢谢!我可能接近这个错误,任何和所有的建议都表示赞赏。

【问题讨论】:

    标签: django django-models django-queryset django-1.7


    【解决方案1】:

    从 Django 1.11 开始,您可以使用OuterRef()

    参考:https://docs.djangoproject.com/en/1.11/ref/models/expressions/#django.db.models.OuterRef

    【讨论】:

      猜你喜欢
      • 2019-12-30
      • 2020-07-31
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 1970-01-01
      • 2020-06-13
      相关资源
      最近更新 更多