Как аннотировать целое число как ForeignKey в django?

У меня эта модель:

class Order(Model):
    sale_address = ForeignKey(Address)
    purchase_address = ForeignKey(Address)

и хотим условно аннотировать тот или иной адрес в зависимости от некоторого условия, как ForeignKey:

order = Order.objects.annotate(
    address=...  # sale_address if current user is seller
).first()

assert isinstance(order.address, Address)  # True

Как я могу это сделать?

Я пробовал следующее:

annotate(
    address_id=Case(
        When(
            user_role='SELLER',
            then=F('sale_address'),
        ),
        When(
            user_role='BUYER',
            then=F('purchase_address'),
        ),
    ),
)

но в этом случае address_id является просто целым числом, и я получаю N+1 проблем при составлении списка заказов с address.region.

Как говорит @AKX, вероятно, лучше просто .select_related(…) [Django-doc] два Addresses, а затем использовать @property для определения того, какой из них использовать, так:

class Order(models.Model):
    user_role = …
    sale_address = models.ForeignKey(
        Address, on_delete=models.CASCADE, related_name='sale_orders'
    )
    purchase_address = models.ForeignKey(
        Address, on_delete=models.CASCADE, related_name='purchase_orders'
    )

    @property
    def address(self):
        if self.user_role == 'SELLER':
            return self.sale_address
        if self.user_role == 'BUYER':
            return self.purchase_address
Вернуться на верх