这是观点:
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
属性指的是相关模型(。