django模型ForeignKey返回ID而非__unicode__中指定的值

0 投票
1 回答
1873 浏览
提问于 2025-04-21 06:13

在使用Django模型时,我有一个外键的设置,代码如下:

class Types_of_Expenditures(models.Model):
    Expenditure_owner = models.CharField(default="None",max_length=50)
    Expenditure_Type = models.CharField(default="Miscellaneous",max_length=50)
    Expenditure_Type_Description = models.CharField(max_length=200)
    def __unicode__(self):
        return self.Expenditure_Type

class Expenditure(models.Model):
    exp_owner= models.CharField(default='None',max_length=50)
    exp_date = models.DateTimeField("Expenditure_Date")
    description = models.CharField(max_length=1000)
    amount = models.FloatField(default=0)
    currency = models.CharField(max_length=15,default="MYR",editable=True)
    exp_pocket = models.ForeignKey(Pockets, null=True, blank=True)
    exp_type = models.ForeignKey(Types_of_Expenditures)

    class Meta:
        unique_together = ('exp_date', 'description',)

    def __unicode__(self):
        return self.description

现在,当我在“支出类型”中保存数据时,我的操作是:

Types_of_Expenditures.objects.get_or_create(Expenditure_owner='a',Expenditure_Type_Description="Default one")

在数据库中,数据是这样的:

id Expenditure_owner Expenditure_Type Expenditure_type_description
 1                a                   Miscellaneous   default one

但是,当我添加任何内容到“支出”时,保存的数据在exp_type中显示为1,但它应该是“杂项”,因为在unicode函数中,我返回的是支出类型。

这是我使用formset来保存“支出”模型数据的方法:

ExpFormSet = modelformset_factory(Expenditure,extra=10,max_num=10,
                fields=('exp_date', 'description','exp_type','amount','currency','exp_pocket'),
                can_delete=False,form=ExpenditureForm)

if request.method == 'POST':
    formset = ExpFormSet(request.POST,queryset=Expenditure.objects.filter(exp_owner=request.user))
if formset.is_valid():
    print "printing formset",formset
    formset.save(commit=True)
    cd = form.cleaned_data
    expenditureType = cd.get('exp_type')
    print "Expenditure Type entered is ",expenditureType
return index(request)

在索引视图中,我做了以下操作:

Expenditure_list = Expenditure.objects.order_by('-exp_date').filter(exp_owner=request.user)
print "Expenditure List is : ", Expenditure_list.values_list()

现在,这个支出视图的输出,Expenditure_list.values_list()的值是(请看最后一个值,它是1,即exp_type的值)

Expenditure List is :  [(3, u'a', datetime.datetime(2014, 9, 12, 15, 32, 10), u'test', 1.0, u'MYR', u'pocket', 1)]

我期望的结果是:

Expenditure List is :  [(3, u'a', datetime.datetime(2014, 9, 12, 15, 32, 10), u'test', 1.0, u'MYR', u'pocket', u'Miscellaneous')]

有没有人能帮我看看这里可能是什么问题?

我觉得这个问题可能有点不对,可能它只会保存外键,也就是ID,而要获取支出类型,我需要通过Types_of_Expenditure.objects.get(pk="列表中的键")来检索。

但我不确定有没有其他的办法?

1 个回答

1

我觉得我明白你的问题了。你似乎期待 values_list 返回一个相关模型的 __unicode__ 值,但其实没有理由认为它会这样做:就像名字所暗示的,它只返回,而外键字段的值其实就是ID。

如果你想的话,可以给 values_list 提供一个字段名的列表,这样就可以在这里遍历关系了:

Expenditure.objects.values_list('description', 'amount', 'exp_type__ Expenditure_Type')

撰写回答