外键查询

问题描述 投票:0回答:1

我有以下型号:

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

编辑:此查询中的发件人始终是当前用户。每个用户的状态恰好为1

欢呼,keslol

django django-models django-queryset django-orm
1个回答
0
投票

如果要查询“下一个”模型,则可以通过select_related来获取状态数据,也可以通过值来获取。您可能应该在状态模型上向用户添加related_name参数。这有两种方法(在将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。如果我们是从用户到下一(多到一),则必须使用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相关的Queryset文档:https://docs.djangoproject.com/en/3.0/ref/models/querysets/#select-related

这是Queryset文档中的值:https://docs.djangoproject.com/en/3.0/ref/models/querysets/#values

© www.soinside.com 2019 - 2024. All rights reserved.