【问题标题】:Django filter returns queryset with ID instead of usernameDjango过滤器返回带有ID而不是用户名的查询集
【发布时间】:2020-12-22 04:08:02
【问题描述】:

大家好,我有一个搜索功能,但是当使用 .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)

'owner_id': 1 , '类别': '食物'}]>

所以不是 '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']

【问题讨论】:

    标签: python django django-models django-views


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您解释 .values() 为何给出 foo_id。我遇到了一个错误:`NameError: name 'F' is not defined `
    • 我已经为F添加了导入。
    • 你,我的朋友,是一颗宝石。感谢您的详尽回答!
    猜你喜欢
    • 2018-12-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 2017-12-05
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多