[Python] Solution to not split logic in django to solve N+1 queries

Discussão em 'Python' iniciado por Stack, Julho 16, 2025.

  1. Stack

    Stack Membro Participativo

    Here are some of my models:

    class CustomUser(AbstractUser):
    def correct_date(self, date=None):
    res = self.dates.order_by("date").all()
    if not len(res):
    return None
    return res[len(res) - 1]


    class Date(models.Model):
    user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name="dates")
    date = models.DateField(auto_now_add=True)


    To fix N+1 queries I need to extract the order_by in the view with a Prefetch:

    queryset = Project.objects.prefetch_related(
    Prefetch(
    "user__dates",
    queryset=Date.objects.order_by('date')
    ),
    )



    and remove the order_by in my correct_date method.

    The problem here is that correct_date depends on the order_by in order to retrieve the last date. But the order_by is in an other file. That could leeds to issues for the ones using the code after.

    Is there any other solutions than:

    • Keeping the code as it is with a comment # needs to be used with an order_by('date') before
    • Using a service to handle all that logic
    • Checking in the correct_date method if it was called with an order_by before, and throwing an error or apply order_by if it wasn't

    Continue reading...

Compartilhe esta Página