【问题标题】:Changing mySQL Query to Django将 mySQL 查询更改为 Django
【发布时间】:2018-11-08 12:58:04
【问题描述】:

我在将以下 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 样式的查询来执行连接。

【问题讨论】:

  • 所以我假设你想要 Systems 对应的 UserPreference username 是给定的用户名?
  • 是的,你是对的。用户名也给出了

标签: python mysql django django-models


【解决方案1】:

我假设您想要Systems,至少其中一个对应的UserPreferences username 是给定的&lt;user&gt;

我们可以通过反向查询集进行查询,使用该模型的名称和两个连续的下划线:

System.objects.filter(<b>userpreference__username='&lt;user&gt;'</b>)

您当然可以将 '&lt;user&gt;' 替换为与用户名匹配的字符串(或“计算”您希望获得的用户名的 Python 表达式)。

这将产生一个QuerySet,其中将包含条件成立的所有Systems。但是请注意,如果存在 multiple UserProfiles 与链接到该 System 的给定 username 存在 multiple 次,则某些 Systems 可能会出现 multiple 次(也许在这里是不可能的,但是因为 username 在您的模型中不是 unique=True,至少从理论上来说,这是可能的)。

如果您希望System 最多出现一次,您可以在QuerySet 上使用.distinct()

# systems occur *at most* once
System.objects.filter(userpreference__username='<user>').distinct()

【讨论】:

  • @Haytes:我添加了一条注释,说明某些Systems 可能会多次发生,以及如何避免这种情况(您可能对此感兴趣)。
  • 这也很有帮助,再次感谢您的快速响应。
猜你喜欢
  • 2020-12-29
  • 1970-01-01
  • 2018-05-08
  • 1970-01-01
  • 2015-03-22
  • 2016-06-04
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多