【问题标题】:Django 1.7 recursive query values?Django 1.7 递归查询值?
【发布时间】:2015-07-06 22:06:41
【问题描述】:

我正在寻找一种 Python 方式来查询类似这样的内容:

# Models
from django.contrib.auth.models import User


class UserProfile(models.Model):
    user = models.OneToOneField(User, related_name='user_profile_set')
    district = models.ForeignKey(District)
    ...


class District(models.Model):
    name : ...

我想获得一个区域(或 pks)列表,就像您在使用 values_list 方法时得到的一样,但对用户模型进行查询。我试过这个:

User.objects.select_related('user_profile').values('user_profile_set__district__pk')
User.objects.all().values('user_profile_set__district__name')
User.objects.all().values_list('user_profile_set__district__name')

但没有任何效果,我使用的是 django 1.7(depth 参数不再可用于select_related 方法)。提前致谢。

【问题讨论】:

    标签: python django django-models django-orm


    【解决方案1】:

    跨关系查询不使用_set 语法。试试这个:

    User.objects.all().values('userprofile__district__name').distinct()
    

    【讨论】:

    • 我用它作为related_name。对不起,我没有提到它。我已经编辑了问题。
    • 那应该可以了。运行查询时会得到什么?
    • 如果我运行 User.objects.all().values('user_profile_set') 我会得到 [{'user_profile_set': 171L}, {'user_profile_set': 232L}, {'user_profile_set': 92L} ... ] 但如果我运行 User.objects.all().values('user_profile_set__district__name') 我会得到 [{'user_profile_set__district__name': None}, {'user_profile_set__district__name': None}, {'user_profile_set__district__name': None} ... ]
    • User.objects.all().values('user_profile_set__district__name').distinct() 返回什么?预计如果不向数据库查询添加distinct 参数,您将获得重复的元素。
    • 它返回一个包含以下内容的列表:{'user_profile_set__district__name': None}, ...
    【解决方案2】:

    您可以尝试这样执行查询:

    UserProfile.objects.values('district__name')
    

    如果您需要从指定的模型实例中查询:

    user_profile.objects.filter(user=my_user).values('district__name')
    

    另外,如果您使用 User.objects.all().values('user_profile_set__district__name') 并获得此输出:

    [{'user_profile_set__district__name': None},  
    {'user_profile_set__district__name': None}, 
    {'user_profile_set__district__name': None} ... ]
    

    这可能意味着您的保存方法无法正常工作,或者至少对于 name 字段,您可能希望使用 shell 并查询您的 District 对象以验证它们是否有名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-25
      • 2017-10-09
      • 2011-08-05
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      相关资源
      最近更新 更多