【问题标题】:Foreign Key Query外键查询
【发布时间】:2020-05-06 15:38:50
【问题描述】:

我有以下型号:

class status(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    #data
class next(models.Model):
    sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sender')
    target = models.ForeignKey(User, on_delete=models.CASCADE, related_name='target')
    #data
class settings(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
        #data

想要查询下一个和状态,输出如下:next,nextdata,status(target)

=> 将目标的状态附加到(下一个)查询集

这可以通过 Django Query 实现吗?或者我应该只写原始 SQL

#

编辑: 此查询中的发件人始终是 current.user, 每个用户都有 1 个状态

#

干杯, 凯斯洛尔

【问题讨论】:

  • 问题是你建模它的方式,对于相同的sender 和相同的target,可以有多个 nexts。所以接下来没有“一”,如果你愿意,可以有零个、一个或多个。通常情况下,最好对其建模。
  • 对于每个用户,总是有 1 个状态,+ next=current.user 。所以我只需要排队状态(目标)
  • 那么我认为在statusUser 中创建一个ForeignKey 来引用下一个更有意义,因为这种建模使得它不可能制作多个链接等。

标签: django django-models django-queryset django-orm


【解决方案1】:

如果您正在查询“下一个”模型,您可以通过 select_related 或值抓取来获取状态数据。您可能应该在状态模型上向用户添加一个 related_name 参数。这里有两种方法(在添加相关名称作为状态之后):

选择相关

for next_instance in next.objects.filter(...).select_related('target__status'):
    # next_instance data is accessible directly through instance attributes
    next_instance.id
    # Because we select_related status, no extra query is done to grab the data for target
    # or status
    next_instance.target.status.id

作为一个小说明,这里使用 select_related 而不是 prefetch_related,因为我们正在从多到 1 遍历。如果我们从用户到下一个(1 到多),我们将不得不使用 prefetch_related,而且我们不能保证只有一个结果。

价值观

data = next.objects.filter(...).values(
    # fields you want as string arguments
    'id',
    'target__status__id'
)
# Data will be a Queryset that if you iterate through will be iterating through 
# dictionaries that contain key value pairs for the fields you put in values.

进一步阅读:

这里是 select_related 的查询集文档: https://docs.djangoproject.com/en/3.0/ref/models/querysets/#select-related

这里是值的查询集文档: https://docs.djangoproject.com/en/3.0/ref/models/querysets/#values

【讨论】:

  • 完美,{{obj.target.status.fe} 之后可以访问模板中的值。
猜你喜欢
  • 1970-01-01
  • 2021-04-06
  • 2011-02-01
  • 2018-09-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
相关资源
最近更新 更多