django объединяет несколько таблиц с помощью select_related () - PullRequest
0 голосов
/ 01 июля 2019

У меня есть три таблицы 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')

Я хочу извлечь автомобили, удовлетворяющие условиям ниже.

  1. Автомобили, которые изпользователь, который не is_out='N'
  2. Автомобили, которые не проданы.(sold_out='N')
  3. Автомобили пользователей, которых нет в столбце 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)

Но, как вы знаете, если блоки растут, возможно, возникает проблема с производительностью.

Вопрос

  1. Есть ли способ объединить блоки?
  2. Вышеупомянутый запрос - лучший вариант?
  3. Есть ли какие-либо дефекты в моей схеме?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...