将mysql查询更改为django

pgky5nke  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(679)

我很难将下面的mysql查询更改为django查询

SELECT * FROM dashboard_db.dashboard_system ds 
JOIN dashboard_db.dashboard_userpreference up 
ON ds.id = up.system_id
WHERE username = "<user>"

以下是我的django应用程序中的模型

class System(models.Model):
   system_name = models.CharField(max_length = 40)
   LOCATION = (('0', 'Inernal'),('1','External'))
   location = models.CharField(max_length=1, choices=LOCATION)

   def __str__(self):
      return self.system_name

class UserPreference(models.Model):
   username = models.CharField(max_length = 40)
   system = models.ForeignKey(System, on_delete = models.CASCADE)

   def __str__(self):
      return self.username

我一直在尝试使用工会和其他一些选择。我知道执行原始sql查询是一种选择。不过,我想知道是否可以使用django样式的查询执行连接。

pftdvrlh

pftdvrlh1#

我想你想要 System 至少有一个对应的 UserPreference s username 是既定的 <user> .
我们可以通过反向查询集进行查询,使用该模型的名称和两个连续的下划线:

System.objects.filter(userpreference__username='<user>')

你当然要替换的地方 '<user>' 与用户名匹配的字符串(或“计算”希望获得的用户名的python表达式)。
这将产生一个 QuerySet 将包含所有 System 条件成立的条件。但是请注意 System 如果出现多个 UserProfile 存在于给定的 username 与此相关的链接 System (也许这在这里是不可能的,但是 username 不是 unique=True 在您的模型中,至少从理论Angular 来看,这是可能的)。
万一你想要一个 System 最多发生一次,可以使用 .distinct()QuerySet :


# systems occur *at most* once

System.objects.filter(userpreference__username='<user>').distinct()

相关问题