[英]Django filter returns queryset with ID instead of username
大家好,我有一個搜索功能,但是當使用 .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': '食物'}]>
所以,而不是 'owner_id': 1 我需要它是 'owner': username
模型(用戶模型是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
屬性指的是相關模型)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.