Как аннотировать целое число как 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] два Address
es, а затем использовать @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