>source
class TransactionHistory(models.Model):
    from_account = models.ForeignKey(
        'Account',
        on_delete=models.CASCADE,
        related_name='from_account'
    )
    to_account = models.ForeignKey(
        'Account',
        on_delete=models.CASCADE,
        related_name='to_account'
    )
    amount = models.DecimalField(
        max_digits=12,
        decimal_places=2
    )
    created_at = models.DateTimeField(default=timezone.now)
    
    @property
    def way(self):
        # Here I need to access a list of user's accounts
        # (request.user.accounts) to mark the transaction
        # as going out or in.
        return

def get_own_transaction_history(me_user):
    my_accounts = me_user.accounts.all()
    # TODO: mark transactions with way as in and out
    own_transactions = TransactionHistory.objects.filter(
        Q(from_account__in=my_accounts) |
        Q(to_account__in=my_accounts)
    )
    return own_transactions

모델에 "way"속성을 추가하여 serializer를 통해 쿼리 셋을 반환하면 사용자가 트랜잭션이 자신의 계정에서 나가는 지 아니면 들어오는 지 알 수 있습니다.하지만 속성 만 추가하면 계산할 수 없습니다. me_user 사용자를 염두에두고 AFAIK 속성은 "from_account"또는 "to_account"와 같은 로컬 모델 필드에만 액세스 할 수 있습니다.


  • 답변 # 1

    다음과 같은 것은 조건식을 사용하는 주석으로 작동합니다. __inWhen 그러나 표현은 약간의 문제를 줄 수 있습니다. 이 쿼리 셋이 반환하는 객체에는 속성이 있습니다. way 주석으로 추가

    from django.db.models import Case, CharField, Value, When
    
    def get_own_transaction_history(me_user):
        my_accounts = me_user.accounts.all()
        return TransactionHistory.objects.filter(
            Q(from_account__in=my_accounts) |
            Q(to_account__in=my_accounts)
        ).annotate(
            way=Case(
                When(from_account__in=my_accounts, then=Value('out')),
                When(to_account__in=my_accounts, then=Value('in')),
                output_field=CharField(),
            )
        )
    
    

관련 자료

  • 이전 javascript/jquery의 모든 확인란을 어떻게 합산하고 부트 스트랩 레이블에 동적으로 표시 할 수 있습니까?
  • 다음 html - 고정 탐색 모음 - z- 색인 설정 후 콘텐츠를 클릭 할 수 없음