[Answered ]-Finding objects according to related objects

2đź‘Ť

Here you go:

# Get all the readings of the user
thread_readings = recipient.threadreading_set.all()

# Build a query object including all messages who's last reading is after the
# last edit that was made AND whose thread is the thread of the current
# iteration's thread reading
q = models.Q()
for thread_reading in thread_readings:
    q = q | models.Q(
        models.Q(
            date_edit__lte=thread_reading.date_last_reading
            & models.Q(
                thread=thread_reading.thread
            )
        )
    )

# Get a queryset of all the messages, including the threads (via a JOIN)
queryset = Message.objects.select_related('thread')

# Now, exclude from the queryset every message that matches the above query
# (edited prior to last reading) OR that is in the list of last readings
queryset = queryset.exclude(
    q | models.Q(
        thread__pk__in=[thread_reading.pk for thread_reading in thread_readings]
    )
)

# Make an iterator (to pretend that this is efficient) and return a generator of it
iterator = queryset.iterator()
return (message.thread for message in iterator)

🙂

Now, don’t ever actually do this – rethink your models. I would read a book called “Object Oriented Analysis and Design with Applications”. It’ll teach you a great deal about how to think when you’re data modelling.

👤orokusaki

Leave a comment