2017-07-26 8 views
0

私は(非常に単純化された)これらのモデルを持っているジャンゴ - 明確な()(注釈では動作しません)

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() 

すべてのヘルプは大歓迎だろう。ありがとうございました。あなたはたとえば、値を追加する必要がある個別のため

+0

にブラケットフィルタに参加することができるあなたは、生データの一例を示すことができます、余分な行についてのコメント付きで注釈を付けた後のデータ? –

答えて

0

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() 
    )).values(
    'seen_conversations', 'conversations__last_message__created_at' 
    ).order_by(
     '-seen_conversations', '-conversations__last_message__created_at' 
    ).distinct() 
+0

ありがとうございますが、動作しません。 – nickname123

0

私はわからないんだけど、

Offer.objects.filter( Q( Q(conversations__user=self) | Q(conversations__receiver=self) ), ).

関連する問題