Как я могу сделать Django Orm с сырым SQL-запросом? - PullRequest
0 голосов
/ 24 января 2019

Я работаю над проектом, а также новым в Django. У меня есть sql необработанный запрос с некоторыми объединениями. Но мое требование - сделать Джанго орм. Я пытался сделать это, но не смог сделать точную форму для этого запроса.

Я пытался сделать это для создания django orm, но не нашел точного результата:

model_data = Model.objects.prefetch_related(
        'modelapi', 'modelauth', 'modelapiconfig').filter(
         modelauth__retrieval_id='XXYY',modelauth__is_active=True).values(
        'model_name',
        'modelauth__retrieval_id',
        'modelapi__api_endpoint_name',
        'modelapi__modelapiconfig__api_config')

Вот мои модели.py:

class Model(models.Model):
    model_name = models.CharField(max_length=40, blank=False,
                                verbose_name='Name',
                                unique=True)

    def __str__(self):
        return self.model_name

    class Meta:
        db_table = 'connector_model'


class ModelApi(models.Model):
    model_id = models.ForeignKey(Model, on_delete=models.CASCADE,
                               verbose_name='MODEL Name', related_name='modelapi')
    model_description = models.CharField(max_length=150,
                                       verbose_name='API Description')
    api_endpoint_name = models.CharField(max_length=100,
                                         blank=False,
                                         verbose_name='API endpoint name', default='')

    def __str__(self):
        return self.model_id.model_name + "_" + self.api_endpoint_name

     class Meta:
            db_table = "connector_model_api"

class ModelAuthentication(models.Model):
    model_id = models.ForeignKey(Model, on_delete=models.CASCADE,
                               verbose_name='MODEL Name', related_name='modelauth')
    email = models.EmailField(max_length=70)
    retrieval_id = models.CharField(max_length=30, blank=False, unique=True)

    def __str__(self):
        return self.model_id.model_name + "_" + self.retrieval_id

    class Meta:

        db_table = "connector_model_authentication"        


class ModelApiConfig(models.Model):
    model_auth = models.ForeignKey(ModelAuthentication, on_delete=models.CASCADE,
                                 verbose_name='MODEL Customer Name')
    model_api = models.ForeignKey(ModelApi, on_delete=models.CASCADE,
                                verbose_name='MODEL API',
                                related_name='modelapiconfig')
    api_config = models.TextField(default={})

    def __str__(self):
        return self.model_auth.model_id.model_name + str("'s ") \
               + self.model_api.api_endpoint_name + str(" endpoint")


    class Meta:

        unique_together = ('model_auth', 'model_api',)

        db_table = "connector_model_api_config"

И мое требование сделать форму для этого запроса SQL:

SELECT
connector_model.model_name,
connector_model_authentication.retrieval_id,
connector_model_authentication.model_config_data,
connector_model_api.api_endpoint_name,
connector_model_api_config.api_config
FROM connector_model 
JOIN 
connector_model_authentication ON (connector_model.id = connector_model_authentication.model_id_id) 
LEFT OUTER JOIN
connector_model_api ON (connector_model.id = connector_model_api.model_id_id)
LEFT OUTER JOIN 
connector_model_api_config ON (
connector_model_api.id = connector_model_api_config.model_api_id
and connector_model_authentication.id = connector_model_api_config.model_auth_id)
WHERE (connector_model_authentication.retrieval_id = 'XXYY'
AND connector_model_authentication.is_active = True);    

В левом внешнем соединении файла connector_model_api_config у меня есть два условия в условии ON (), так как я могу добавить два условия в мой запрос django orm?

Пожалуйста, помогите мне, если у кого-нибудь есть решение.

...