簡體   English   中英

Django 過濾器返回帶有 ID 而不是用戶名的查詢集

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM