英文:
Converting List to QuerySet Django
问题
以下是您的代码的翻译部分:
models.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,})
至于您提到的问题,您想要将result
列表转换为一个QuerySet对象,但是在Django中,QuerySet通常是从数据库查询中获取的,而不是手动创建的。如果您想要应用django_filters
,您可以尝试将您的数据查询转换为一个QuerySet对象。例如,您可以使用filter()
和annotate()
方法来构建您的查询,然后将其传递给django_filters
。以下是一个示例:
from django.db.models import F
result_qs = Request.objects.annotate(
match_quota=Quota.objects.filter(
part_number__series=F('part_number__series'),
date__range=(F('date') - timedelta(days=2), F('date') + timedelta(days=2))
)
)
# 现在,result_qs 包含了您想要的查询结果,您可以使用 django_filters 进行进一步的筛选。
这只是一个示例,具体的逻辑可能需要根据您的需求进行修改。希望这可以帮助您解决问题。
英文:
models.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,})
I wanted to connect django_filters, but ran into a problem AttributeError: 'list' object has no attribute '_meta'. How can I change the logic of my code to retrieve a QuerySet object?
result_qs = QuerySet(result) it didn't help
答案1
得分: 1
你可以创建一个包含你的对象在列表中的ID的列表。然后简单地按照这些ID进行筛选。
instances = [<MyModel: 1>, <MyModel: 2>]
list_of_ids = [inst.id for inst in instances]
queryset = MyModel.objects.filter(id__in=list_of_ids)
英文:
You can create a list of ids of your objects in the list. Then simply filter by them.
instances = [<MyModel: 1>, <MyModel: 2>]
list_of_ids = [inst.id for inst in instances]
queryset = MyModel.objects.filter(id__in=list_of_ids)
答案2
得分: 0
以下是翻译好的部分:
# 通过将它们附加到一个数组中,然后根据`date`使用Python的`chain`迭代工具对它们进行排序,您可以合并2个模型。
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 %}
<!-- 这里呈现Quota模型 -->
{% else %}
<!-- 这里呈现Request模型 -->
{% endif %}
{% endfor %}
英文:
You can merge 2 models by appending them in one array and then sort them based on date
by using Python chain
itertools
from itertools import chain
here is the requests_and_quotas
function
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,})
then here is how you can decide what will appear in the template based on unique field of the models
{% for item in queryset %}
{% if item.supplier %}
<!-- here Quota model render -->
{% else %}
<!-- here Request model render -->
{% endif %}
{% endfor %}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论