【问题标题】:Django - impossible to access object attributes when applying a filterDjango - 应用过滤器时无法访问对象属性
【发布时间】:2012-10-11 09:04:53
【问题描述】:

我对 Django 有以下问题:

我的模型定义如下:

from django.db import models

class SettingSection(models.Model):
    section = models.CharField(max_length=20)
    def __unicode__(self):
        return self.section

class SettingParam(models.Model):
    section = models.ForeignKey(SettingSection)
    param = models.CharField(max_length=20, unique=True)
    description = models.CharField(max_length=200, blank=True)
    def __unicode__(self):
        return self.param

class SettingPreset(models.Model):
    preset = models.CharField(max_length=20, unique=True)
    current = models.BooleanField()
    def __unicode__(self):
        return self.preset

class SettingValue(models.Model):
    preset = models.ForeignKey(SettingPreset)
    param = models.ForeignKey(SettingParam)
    value = models.CharField(max_length=100, blank=True)
    def __unicode__(self):
        return self.value

尝试访问我的 SettingValue 对象的任何属性时出现以下错误:

>>> from settings.models import *
>>> preset = SettingPreset.objects.get(current=True)
>>> for section in SettingSection.objects.all():
...     for param in section.settingparam_set.all():
...             v = SettingValue.objects.filter(preset=preset, param=param)
...             print v.id, v.value
... 
Traceback (most recent call last):
  File "<console>", line 4, in <module>
AttributeError: 'QuerySet' object has no attribute 'id'

但是,属性(“id”和“value”)似乎存在:

>>> for section in SettingSection.objects.all():
...     for param in section.settingparam_set.all():
...             v = SettingValue.objects.filter(preset=preset, param=param)
...             print v.values()
... 
[{'value': u'192.168.1.29', 'id': 1, 'preset_id': 1, 'param_id': 1}]
[{'value': u'en1', 'id': 2, 'preset_id': 1, 'param_id': 2}]
[{'value': u'0', 'id': 3, 'preset_id': 1, 'param_id': 3}]
[{'value': u'', 'id': 4, 'preset_id': 1, 'param_id': 4}]
[{'value': u'', 'id': 5, 'preset_id': 1, 'param_id': 5}]

此外,我无需对我的对象应用过滤器即可访问任何属性:

>>> for v in SettingValue.objects.all():
...     print v.id, v.value
... 
1 192.168.1.29
2 en1
3 0
4 
5 

【问题讨论】:

    标签: django attributes django-queryset attributeerror


    【解决方案1】:

    变量 v 是一个查询集,您不能通过查询集访问模型属性。因此,您应该尝试访问查询集中的第一个元素:

    for param in section.settingparam_set.all():
        v = SettingValue.objects.filter(preset=preset, param=param)
        print v[0].id, v[0].value #access first element in query set
    

    或者这样做循环你的查询集中的项目:

    for param in section.settingparam_set.all():
        v = SettingValue.objects.filter(preset=preset, param=param)
        for item in v:
            print item.id, item.value
    

    【讨论】:

    • 哇,多么快速和完美的答案。你真的很摇滚!千感谢汤姆。
    • 不客气。不要忘记将问题标记为已回答,以向其他用户显示问题已解决,并向我的帐户添加一些业力点 ;-)
    • 我已将问题标记为已回答,但我的声誉似乎还没有达到让我有特权给你加分的水平。无论如何,感谢一千次。
    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 2016-07-22
    • 2018-09-13
    • 1970-01-01
    相关资源
    最近更新 更多