Django ORM: Я хочу преобразовать сырой запрос в Django ORM [NEED HELP].

В зависимости от типа пользователя, я хочу присоединиться к связанной таблице.

если тип пользователя 'pi' prefetch_related('content_object__stores)

else prefetch_related('content_object__store_set), но объедините оба запроса вместе.

Есть идея преобразовать сырой запрос в Django ORM???

SELECT * FROM user AS u
LEFT JOIN provisioning_company AS c
ON u.company_id = c.id AND u.type != 'pi'
LEFT JOIN provisioning_picker AS p
ON u.company_id = p.id AND u.type = 'pi';

class User(AbstractUser):
        content_type = models.ForeignKey(ContentType, on_delete=models.DO_NOTHING, default=None, null=True)
        related_id = models.IntegerField(default=None, null=True)
        content_object = GenericForeignKey('content_type', 'company_id')
        type = models.CharField(max_length=2, choices=user_type_choices)
    
    
    
class Picker(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=128)
    email = models.EmailField(max_length=256)
    mobile = models.CharField(max_length=16, unique=True)
    stores = models.ManyToManyField(
        Store,
        verbose_name='stores',
        blank=True,
        help_text="stores",
        related_name="picker_set",
        related_query_name="picker_set",
        db_table="provisioning_picker_store",
    )
    
    
class Store(CommonModel):
    companies = models.ManyToManyField(
            Company,
            verbose_name='companies',
            blank=True,
            help_text="companies",
            related_name="store_set",
            related_query_name="store_set",
            db_table="provisioning_company_store_relation",
        )

пробовал что-то вроде

User.objects.prefetch_related(
    Prefetch("content_object__store_set", queryset=User.objects.exclude("pi"))
).prefetch_related(Prefetch("stores", queryset=User.objects.filter("pi")))

но он не работает как необработанный запрос. Любая помощь будет оценена по достоинству.

Вернуться на верх