私は(非常に単純化された)これらのモデルを持っているジャンゴ - 明確な()(注釈では動作しません)
class Offer(models.Model):
product = ForeignKey(Product)
class Conversation(models.Model):
user = ForeignKey(settings.AUTH_USER_MODEL)
receiver = ForeignKey(settings.AUTH_USER_MODEL)
offer = ForeignKey(Offer, related_name='conversations')
last_message = OneToOneField('Message', null=True, blank=True)
class Message(models.Model):
message = TextField()
status = CharField(
max_length=128,
choices=constants.MESSAGE_STATUS_CHOICES,
default=constants.MESSAGE_STATUS_SENT,
)
sender = ForeignKey(settings.AUTH_USER_MODEL)
conversation = ForeignKey(Conversation)
created_at = DateTimeField(auto_now_add=True)
私は最初のメッセージを見ていないことにより、注文した会話とオファーを、持って帰りたいと思うので、私は私が」と思いました)オファーが見られたりされていないかを示すために注釈を使用しますが、個別の()(注釈では動作しませんdは:
class User(AbstractUser):
def get_offers_with_conversations(self):
"""
Get offers with conversations. Not seen conversations first.'
"""
return Offer.objects.filter(
Q(conversations__user=self) |
Q(conversations__receiver=self),
).annotate(seen_conversations=Case(
When(
~Q(conversations__last_message__sender=self) &
Q(conversations__last_message__status=conversation_constants.MESSAGE_STATUS_SENT),
then=Value(True)
),
default=Value(False), output_field=BooleanField()
)).order_by(
'-seen_conversations', '-conversations__last_message__created_at'
).distinct()
すべてのヘルプは大歓迎だろう。ありがとうございました。あなたはたとえば、値を追加する必要がある個別のため
にブラケットフィルタに参加することができるあなたは、生データの一例を示すことができます、余分な行についてのコメント付きで注釈を付けた後のデータ? –