2012-10-21 13 views
1

當屬性我有以下問題和Django: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」 和 「值」)似乎存在:

>>> 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 

回答

2

變量v是一個QuerySet,你不能訪問你的模型通過查詢集屬性。因此,你應該試試這個訪問的第一個元素在你的查詢集:

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 
+0

哇,真是一個超級快,完美的答案。你真的很搖滾!千謝謝湯姆。 –

+0

不客氣。不要忘記將問題標記爲向其他用戶表明問題已解決,並向我的帳戶添加一些業力點;-) –

+0

我已將問題標記爲已回答,但似乎我的聲譽尚未達到授予我特權給你加分。無論如何,感謝一千次。 –