Как я могу объединить два разных запроса к модели и упорядочить их по полю, которое есть у обеих моделей?

Как я могу объединить два различных запроса к модели и упорядочить их по полю, которое есть в обеих моделях, как поля прогресса.

Например

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 the User model [Django-doc] directly. For more information you can see the referencing the User 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.

Однако такая фильтрация будет гораздо менее эффективной

Вернуться на верх