Django过滤器使用ID而不是用户名返回queryset


大家好,我有一个搜索函数,但当使用.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,'amount':2.33,'date':datetime.date(2020,10,2(,'description':'Something','owner_id':1,'category':'Food'}]>

所以我不需要"owner_id":1而是"owner":username

模型(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']

您可以向.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()

您必须为新字段命名除";所有者";,或者你会得到一个ValueError:

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

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

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

最新更新