将列表转换为 Django 查询集

问题描述 投票:0回答:2

模型.py

class Part(models.Model):
    series = models.CharField(max_length=100)
    number = models.CharField(max_length=100)
    brand = models.CharField(max_length=100)

class Request(models.Model):
    part_number = models.ForeignKey(Part, on_delete=models.CASCADE)
    brand = models.CharField(max_length=100)
    quantity = models.PositiveIntegerField()
    date = models.DateField()

class Quota(models.Model):
    part_number = models.ForeignKey(Part, on_delete=models.CASCADE)
    brand = models.CharField(max_length=100)
    quantity = models.PositiveIntegerField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    supplier = models.CharField(max_length=100)
    date = models.DateField()

views.py

def requests_and_quotas(request):
    requests = Request.objects.all()
    quotas = Quota.objects.all()
    result = []
    for req in requests:
        match = False
        for quo in quotas:
            if (req.part_number.series == quo.part_number.series) and (abs((req.date - quo.date).days) <= 2):
                result.append({'request': req, 'quota': quo})
        if not match:
            result.append({'request': req, 'quota': None})
    return render(request, 'requests_and_quotas.html', {'result': result,})

我想连接 django_filters,但遇到了问题 AttributeError: 'list' object has no attribute '_meta'。如何更改代码逻辑以检索 QuerySet 对象?

result_qs = QuerySet(结果) 它没有帮助

python django django-views django-queryset django-filter
2个回答
0
投票

您可以在列表中创建对象的 id 列表。然后简单地过滤它们。

instances = [<MyModel: 1>, <MyModel: 2>]
list_of_ids = [inst.id for inst in instances]
queryset = MyModel.objects.filter(id__in=list_of_ids)

0
投票

您可以通过将 2 个模型附加到一个数组中来合并它们,然后使用 Python

date
itertools
 基于 
chain

对它们进行排序
from itertools import chain

这是

requests_and_quotas
功能

def requests_and_quotas(request):
    requests = Request.objects.all()
    quotas = Quota.objects.all()
    queryset = []
    
    queryset.append(requests)
    queryset.append(quotas)
    if len(queryset):
            queryset = sorted(chain(*queryset), reverse=True, key=lambda queryset: queryset.date)
        
    return render(request, 'requests_and_quotas.html', {'queryset': queryset,})

那么您可以根据模型的独特字段来决定模板中显示的内容

{% for item in queryset %}
    {% if item.supplier %}
        <!-- here Quota model render -->
    {% else %}
        <!-- here Request model render -->
    {% endif %}
{% endfor %}
© www.soinside.com 2019 - 2024. All rights reserved.