如何将下面的 SQL 状态转换为 Django ORM

How to convert SQL states below to Django ORM

很难将下面的 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")

Django 第二模型:

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)

假设您在名为 horaire:

的 django 应用程序中拥有这些模型
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 中 shell 你可以这样做:

$> 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 实现它的相关方法(请参阅这个answer for more details)。 除此之外,您始终可以传递 Raw SQL,当然您也可以编写自定义 SQL 查询,稍后您可以在您的应用程序下使用数据。 有关 Raw SQL in Django 的更多信息,请访问此 documentation link