如何从ManyToMany字段获取值?

时间:2013-09-24 22:26:53

标签: python django django-models

我有模特:

class SettingField(models.Model):
    name = models.CharField(max_length=200)
    value = models.TextField(max_length=200)

    [...]

class Setting(models.Model):
    setting_type = models.CharField(max_length=1, choices=STYPES)
    fields = models.ManyToManyField(SettingField, null=True)

    [...]

并形成:

class SettingsForm(forms.Form):
    login = forms.CharField(
        required=True,
        label=u'Login'
        )
    password = forms.CharField(
        widget=forms.PasswordInput,
        required=True,
        label=u'Password'
        )

在视图中我有:

if request.method == 'POST':
    form = SettingsForm(request.POST)
    if form.is_valid():
        setting = Setting()
        setting.setting_type = 'd'
        setting.save()
        for ff in form.fields:
            setting_field = SettingField()
            setting_field.name = ff
            setting_field.value = form.cleaned_data[ff]
            setting_field.save()
            setting.fields.add(setting_field)

这会存储具有依赖于表单的自定义字段的设置。但现在我想得到这些数据:

s_objs = Setting.objects.filter(setting_type='d')

logins = list()

for so in s_objs:
    logins.append({
        "login": so.fields.??? what here ???,
        "password": so.fields.??? what here ???
    })

怎么做?我可以使用循环并比较名称,但也许还有另一种方式。

1 个答案:

答案 0 :(得分:1)

这将为您提供一个包含与之相关的所有字段的名称和值的字典。

so.fields.all().values('name', 'value')

你不想经常访问db,所以在s_objs上使用prefetch_related:

s_objs = Setting.objects.filter(setting_type='d').prefetch_related('fields')
相关问题