为了账号安全,请及时绑定邮箱和手机立即绑定

Django 过滤器返回带有 ID 而不是用户名的查询集

Django 过滤器返回带有 ID 而不是用户名的查询集

元芳怎么了 2023-07-11 17:16:39
大家好,我有一个搜索功能,但是当使用 .objects.filter() 方法时,我得到一个显示 ID 而不是用户名的查询集。这是视图:def search_expense(request):    if request.method == 'POST':        search_str = json.loads(request.body).get('searchText')        expenses = Expense.objects.filter(            amount__istartswith=search_str) | Expense.objects.filter(            date__icontains=search_str) | Expense.objects.filter(            description__icontains=search_str) | Expense.objects.filter(            category__icontains=search_str)        data = expenses.values()        return JsonResponse(list(data), safe=False)<QuerySet [{'id': 16, '金额': 2.33, '日期': datetime.date(2020, 10, 2), '描述': '某事', 'owner_id': 1 , '类别' : '食品'}]>因此,我需要将 'owner_id': 1 改为 'owner': username,而不是 'owner_id': 1模型(User模型是Django的标准模型):class Expense(models.Model):    amount = models.FloatField()    date = models.DateField(default=now)    description = models.TextField()    owner = models.ForeignKey(to=User, on_delete=models.CASCADE)    category = models.CharField(max_length=255)    def __str__(self):        return self.category    class Meta:        ordering: ['-date']
查看完整描述

1 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

您可以向 中添加新字段.values()

from django.db.models import F
fields = tuple(x.name for x in Expense._meta.get_fields())
data = expenses.values(*fields, owner_name=F("owner__value"))

您还必须手动指定您想要的所有字段,或者如果您想要所有字段,那么您可以.get_fields()像我一样使用。

您必须将新字段命名为“owner”以外的其他名称,否则您将得到ValueError

ValueError: The annotation 'owner' conflicts with a field on the model.

.values()根据文档显示ForeignKey字段的ID是预期的行为:

foo如果您有一个名为a 的字段ForeignKey,则默认values()调用将返回一个名为 的字典键foo_id,因为这是存储实际值的隐藏模型属性的名称(该foo属性引用相关模型)。


查看完整回答
反对 回复 2023-07-11
  • 1 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信