Как преобразовать приведенные ниже состояния SQL в Django ORM - PullRequest
0 голосов
/ 24 января 2019

С трудом можно преобразовать приведенные ниже операторы SQL в Django ORM. Любая помощь очень ценится.

SELECT a.state, 
       a.city, 
       a.postcode, 
       b.rate_authority, 
       b.rate, 
       b.rate_descr 
FROM   fileload_taxratemodel AS a 
       INNER JOIN fileload_taxrateresponsemodel AS b 
               ON b.jurs_id_id = a.id 
ORDER  BY state ASC 

Модели Django:

Попытка получить поля из обеих моделей на основе внешнего ключа.

class TaxRateModel(models.Model):

company_code = models.CharField(max_length = 10)
document_date = models.DateTimeField()
country = models.CharField(max_length = 30, default = "US")
province = models.CharField(max_length = 100, null= True,blank= True)
state = models.CharField(max_length = 100)
county = models.CharField(max_length = 100,blank=True, null=True)
city = models.CharField(max_length = 100,blank=True, null=True)
district = models.CharField(max_length = 100, blank=True, null=True)
postcode = models.CharField(max_length = 5, blank=True, null=True)
rate_code = models.CharField(max_length = 30,default = "ST")

Джанго, 2-я модель:

class TaxRateResponseModel(models.Model):
jurs_id = models.ForeignKey(TaxRateModel,on_delete=models.CASCADE,related_name='rates')
rate_authority = models.CharField(max_length = 100, blank=True, null=True, default='')
rate_descr = models.CharField(max_length = 100, blank=True, null=True, default ='')
rate = models.DecimalField(max_digits= 10, decimal_places=5)

1 Ответ

0 голосов
/ 24 января 2019

Предположим, у вас есть эти модели в приложении django под названием horaire:

class A(models.Model):
    city = models.CharField(max_length=200, null=True, blank=True)
    postcode = models.CharField(max_length=200, null=True, blank=True)
    state = models.CharField(max_length=200, null=True, blank=True)


class B(models.Model):
    jurs_id = models.ForeignKey(A, related_name="ab", on_delete=models.DO_NOTHING)
    rate_authority = models.CharField(max_length=200, null=True)
    rate = models.CharField(max_length=200, null=True)
    rate_descr = models.CharField(max_length=200, null=True)

В оболочке вашего django вы можете сделать:

$> from horaire.models import B
$> items = B.objects.values(
       'jurs_id__city',
       'jurs_id__state',
       'jurs_id__postcode',
       'rate_authority',
       'rate',
       'rate_descr'
   ).order_by('jurs_id__state')
$> print(items.query)
SELECT 
    "horaire_a"."city", 
    "horaire_a"."state", 
    "horaire_a"."postcode",
    "horaire_b"."rate_authority",
    "horaire_b"."rate",
    "horaire_b"."rate_descr" 
FROM "horaire_b" 
    INNER JOIN "horaire_a" ON ("horaire_b"."jurs_id_id" = "horaire_a"."id") 
ORDER BY "horaire_a"."state" ASC

ИЛИ вы можете сделать:

$> from horaire.models import A
$> items = A.objects.values(
       'city',
       'postcode',
       'state',
       'ab__rate_authority',
       'ab__rate',
       'ab__rate_descr'
   ).order_by('state')
$> print(items.query)
SELECT 
    "horaire_a"."city", 
    "horaire_a"."postcode", 
    "horaire_a"."state", 
    "horaire_b"."rate_authority", 
    "horaire_b"."rate", 
    "horaire_b"."rate_descr" 
FROM "horaire_a" 
    LEFT OUTER JOIN "horaire_b" ON ("horaire_a"."id" = "horaire_b"."jurs_id_id") 
ORDER BY "horaire_a"."state" ASC

Однако, как вы можете видеть, в окончательных SQL-запросах нет ALIAS, и я не нашел относительного способа сделать это, используя DJANGO ORM (см. Этот ответдля более подробной информации ).Кроме того, вы всегда можете передать Raw SQL и, конечно, вы можете написать свой собственный запрос SQL, а затем использовать данные в своих приложениях.Для получения дополнительной информации о Raw SQL in Django посетите эту документацию по ссылке

...