Ich habe eine folgende Modelle:Django ManyToMany Abfrage seltsame Verhalten
class Post(Model):
word = TextField()
subscribers = ManyToManyField(User, related_name='subscribed', through='Subscription')
class Subscription(Model):
post = ForeignKey(Post)
subscriber = ForeignKey(User)
date_subscribed = DateTimeField(default=timezone.now)
class Meta:
ordering = ('-date_subscribed',)
unique_together = (('post', 'subscriber'))
Was ich tun möchte, ist alle Beiträge zu wählen und bestellen sie nach der Anzahl der Teilnehmer, und wenn die Anzahl der Teilnehmer gleich ist, um durch zuletzt date_subscribed
.
Meine Eingangsdaten:
post1 = Post(text="post1")
post2 = Post(text="post2")
post3 = Post(text="post3")
post4 = Post(text="post4")
user1 = User(username="user1")
user2 = User(username="user2")
user3 = User(username="user3")
user4 = User(username="user4")
Subscription.objects.create(post=post1, user=user1)
Subscription.objects.create(post=post2, user=user1)
Subscription.objects.create(post=post3, user=user1)
Subscription.objects.create(post=post3, user=user2)
Subscription.objects.create(post=post3, user=user3)
Subscription.objects.create(post=post3, user=user4)
Subscription.objects.create(post=post4, user=user1)
Subscription.objects.create(post=post4, user=user2)
Subscription.objects.create(post=post4, user=user3)
Diese Abfrage funktioniert wie erwartet, aber es bestellen nicht von date_subscribed
:
Post.objects.annotate(s_count=Count('subscribers')).order_by('-s_count')
Wenn ich schreibe:
Post.objects.annotate(s_count=Count('subscribers')).order_by('-s_count', '-subscription__date_subscribed')
Ich habe seltsame Ergebnisse und ich verstehe dieses Verhalten nicht wirklich. Für obige Daten gibt es genau alle Posts mit s_count=1
aus.
Warum s_count
ist 1? Und auch, wie man zuletzt richtig bestellt date_subscribed
?
UPD: Noch eine Frage. Warum gibt Post.objects.annotate(s_count=Count('subscribers')).order_by('-s_count', '-subscription__date_subscribed').count()
4 statt Anzahl der Zeilen im Abonnement?
Ziemlich einfach. Vielen Dank. –
Ich bin froh, dass ich helfen kann. – AKS
Noch eine Frage. Warum Post.objects.annotate (s_count = Anzahl ('Abonnenten')). Order_by ('- s_count', '-subscription__date_subscribed'). Count() gibt 4 statt Anzahl der Zeilen im Abonnement? –