@G_r_i_n_v_i_c_h

Как сделать выборку left join distinct (БД: mysql)?

Изначальная задача:
есть группа контрагентов, есть пользователи. У каждого пользователя своя сортировка контрагентов.

class Supplier(models.Model):
    name = models.CharField(max_length=512)
    short_name = models.CharField(max_length=100, unique=True)

class SupplierPosition(models.Model):
    supplier = models.ForeignKey(Supplier, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    position = models.PositiveIntegerField()


Надо получить всех контрагентов с сортировкой по позиции. Если позиции нет, то получить контрагента все равно. В общем sql:
SELECT * FROM accounting_supplier as s 
LEFT JOIN  ( SELECT * FROM accounting_supplierposition WHERE user_id = 1 ) as sp 
on sp.supplier_id = s.id;


Нашел похожий вопрос на стэковерфлоу:
https://stackoverflow.com/questions/38060232/djang...

Сделал также, но дистинкт не работает. Попробовал в raw:
objects.raw("SELECT * FROM accounting_supplier as s LEFT JOIN  
( SELECT position, supplier_id FROM accounting_supplierposition WHERE user_id = %s ) as sp 
on sp.supplier_id = s.id ORDER BY sp.position", [request.user])

Но почему-то не работает сортировка. Если делаю запрос напрямую в БД – все ок. В Джанге получается одинаковая сортировка для всех пользователей.
  • Вопрос задан
  • 38 просмотров
Решения вопроса 1
tumbler
@tumbler Куратор тега Django
бекенд-разработчик на python
objects.raw("SELECT * FROM accounting_supplier as s LEFT JOIN  
( SELECT position, supplier_id FROM accounting_supplierposition WHERE user_id = %s ) as sp 
on sp.supplier_id = s.id ORDER BY sp.position", [request.user.id])

Вы repr пользователя подставляете, а надо его id.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы