@reqww

Как правильно написать raw sql?

Есть модель чата:
class Chat(models.Model):
    participants = models.ManyToManyField(Contact, related_name='chats')
    messages = models.ManyToManyField(Message, blank=True)

    def __str__(self):
        return f'{self.pk}'

    class Meta:
        verbose_name = 'Чат'
        verbose_name_plural = 'Чаты'


и есть модель пользователя:
class Contact(AbstractBaseUser, PermissionsMixin):
    '''Кастомная модель пользователя'''
    email = models.EmailField(verbose_name='email', max_length = 60, unique = True)
    slug = models.SlugField(default='')
    first_name = models.CharField(max_length=30, default = '')
    last_name = models.CharField(max_length=30, default = '')
    phone_number = models.CharField(max_length=11)
    date_joined = models.DateTimeField(verbose_name='date joined', auto_now_add = True)
    last_login = models.DateTimeField(verbose_name='last login', auto_now = True)
    is_admin = models.BooleanField(default=False)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    avatar = models.ImageField(upload_to='user_avatars/%Y/%m/%d', blank=True)
    is_active = models.BooleanField(default=False)
    status = models.CharField(max_length=100, default='', blank=True)
    friends = models.ManyToManyField('self', blank=True)
    

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name', 'last_name', 'phone_number', 'slug']

    objects = ContactManager()

    def __str__(self):
        return self.email

    def get_url(self):
        try:
            return self.avatar.url
        except ValueError:
            return None


Пытаюсь из этой таблицы вытащить тот чат, в котором есть определенные участники
В данном случае это участники с id 1 и 2, но в последствии это будут определенные участники
Пытался написать что-то такое:
c = Contact.objects.filter(id=1).raw('SELECT *, id AS chat_id FROM chat_chat WHERE participants=1 AND participants=2')

Но получаю ошибку:
OperationalError: no such column: participants

В чем моя ошибка?
И как бы так написать, чтобы это работало?
Спасибо!
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ответы на вопрос 1
@bacon
1. ManyToManyField реализуется через промежуточную таблицу, не будет там participants в явном виде, разберитесь с этим, достаточно посмотреть через dbshell
2. raw скорее всего уже нельзя применить к QuerySet (возможно через какой-нибудь RawSQL, но точно не так )
3. Запрос простой, зачем вообще тут raw?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы