У меня есть три таблицы users
, blocks
, cars
class User(models.Model):
user_id = models.BigIntegerField(primary_key=True)
is_out = models.CharField(default='N')
birthday = models.DateTimeField()
class Cars(models.Model):
user_id = models.ForeignKey(User, on_delete=models.CASCADE, db_column='user_id', related_name='cars')
title = models.CharField()
sold_out = models.CharField(default='N')
class Blocks(models.Model):
user_id = models.BigIntegerField()
target_user_id = models.ForeignKey(User, on_delete=models.CASCADE, db_column='target_user_id', related_name='blocks')
Я хочу извлечь автомобили, удовлетворяющие условиям ниже.
- Автомобили, которые изпользователь, который не
is_out='N'
- Автомобили, которые не проданы.(
sold_out='N'
) - Автомобили пользователей, которых нет в столбце
target_user_id
таблицы блоков, связанной с user_id = 10000
Чтобы получить автомобили, которые соответствуют вышеуказанному условию, янаписал запрос следующим образом.
blocks = Blocks.objects.filter(user_id=10000).values_list('target_user_id', flat=True)
Cars.objects.filter(sold_out='N').select_related('user_id').filter(user_id__is_out='N').exclude(user_id__in=blocks)
Но, как вы знаете, если блоки растут, возможно, возникает проблема с производительностью.
Вопрос
- Есть ли способ объединить блоки?
- Вышеупомянутый запрос - лучший вариант?
- Есть ли какие-либо дефекты в моей схеме?
Спасибо.