2022-06-27

Django 4.x - Conditional QuerySet for Pagination and a many-to-many relationship

Disclaimer: I have searched and a question tackling this particular challenge could not be found at the time of posting.

The Requirement

For a Class Based View I need to implement Pagination for a QuerySet derived through a many to many relationship. Here's the requirement with a more concrete description:

  • Many Library Records can belong to many Collections
  • Web pages are required for most (but not necessarily all) Collections, and so I need to build views/templates/urls based on what the client identifies as required
  • Each Collection Page displaying the relevant Library Records requires Pagination, as there may be 100's of records to display.

The First Approach

And so with this requirement in mind I approached this as I normally would when building a CBV with Pagination. However, this approach did not allow me to meet the requirement. What I quickly discovered was that the Pagination method in the CBV was building the object based on the declared model, but the many to many relationship was not working for me.

I explored the use of object in the template, but after a number of attempts I was getting nowhere. I need to display Library Record objects but the many to many relationship demands that I do so after determining the records based on the Collection they belong to.

EDIT - Addition of model

models.py

class CollectionOrder(models.Model):
    collection = models.ForeignKey(
        Collection,
        related_name='collection_in_collection_order',
        on_delete=models.PROTECT,
        null=True,
        blank=True,
        verbose_name='Collection'
    )
    record = models.ForeignKey(
        LibraryRecord,
        related_name='record_in_collection_order',
        on_delete=models.PROTECT,
        null=True,
        blank=True,
        verbose_name='Library record',
    )
    order_number = models.PositiveIntegerField(
        blank=True,
        null=True,
    )


No comments:

Post a Comment