Как я могу объединить два разных запроса к модели и упорядочить их по полю, которое есть у обеих моделей?
Как я могу объединить два различных запроса к модели и упорядочить их по полю, которое есть в обеих моделях, как поля прогресса.
Например
models.py
class Gig(models.Model):
author= models.ForeignKey(User)
title = models.CharFields()
progress = models.IntegerField()
class Project(models.Model):
author= models.ForeignKey(User)
title = models.CharFields()
progress = models.IntegerField()
Могу ли я сделать свой view.py таким образом, чтобы добиться этого?
И если нет, то как я могу этого достичь?
views.py
def fetch_all_item(request):
gig = Gig.objects.filter(author_id = request.user.id)
project = Project.objects.filter(author_id = request.user.id)
total_item = (gig + project).order_by("progress")
return render(request, "all_product.html", {"item": total_item})
Я пытаюсь объединить два набора запросов из моделей Gig и Project, затем отправить их во фронтенд в форме ordering по имени field с названием progress.
Вы можете позволить Python сделать сортировку за вас, например:
from operator import attrgetter
def fetch_all_item(request):
gig = Gig.objects.filter(author=request.user)
project = Project.objects.filter(author=request.user)
total_item = sorted([*gig, *project], attrgetter('progress'))
return render(request, "all_product.html", {'item': total_item})
Однако, возможно, лучше переделать это в единую модель с полем type
, которое различает Gig
и Project
.
Note: It is normally better to make use of the
settings.AUTH_USER_MODEL
[Django-doc] to refer to the user model, than to use theUser
model [Django-doc] directly. For more information you can see the referencing theUser
model section of the documentation.
В общем случае, такое проектирование при наличии общих полей лучше осуществлять путем наследования от некоторого базового класса. Например:
class CommonActivity(models.Model):
# common fields for Project/Gig
author = models.ForeignKey(User)
title = models.CharFields()
progress = models.IntegerField()
class Gig(CommonActivity):
pass # or other fields related to Gig only
class Project(CommonActivity):
pass
Затем, если вы хотите запросить оба запроса - вы запрашиваете CommonActivity
.
Если переделка невозможна - тогда фильтруйте через Python, как предложил @WillemVanOnsem.
Однако такая фильтрация будет гораздо менее эффективной