【问题标题】:Django raw query join many to many fieldDjango原始查询加入多对多字段
【发布时间】:2019-02-01 14:58:15
【问题描述】:

模型.py

class RestaurantKeyword(models.Model):
    keywords=models.CharField(max_length=200)
    def __str__(self):
        return str(self.keywords)

class Restaurant(models.Model):
    name=models.CharField(max_length=500)
    email=models.CharField(max_length=500)
    web=models.CharField(max_length=500)
    short_description=models.CharField(max_length=500)
    description=models.CharField(max_length=500)
    phone=models.IntegerField(blank=True,null=True,default=0)
    lat =models.FloatField(blank=True,null=True)
    lng =models.FloatField(blank=True,null=True)
    address1 = models.CharField(max_length=100)
    address2 = models.CharField(max_length=100,blank=True)
    city = models.CharField(max_length=100)
    state = models.CharField(max_length=2)
    postalcode = models.CharField(max_length=20)    
    avg_rating=models.FloatField(blank=True,null=True)
    restaurant_type=models.ForeignKey(RestaurantType,on_delete=models.CASCADE)
    price=models.IntegerField(blank=True,null=True,default=0)
    keywords=models.ManyToManyField(RestaurantKeyword,blank=True)
    def __str__(self):
        return self.name

SQL 原始查询

SELECT id,name,( 3959 * acos ( cos ( radians(30.696627)) * cos( radians( lat ) ) * cos( radians( lng ) - radians(76.693764) ) + sin ( radians(30.696627) ) * sin( radians( lat ) ) ) ) AS distance  FROM newbackend_restaurant

我有 lat、lng、关键字等参数。我需要一个查询,我可以使用关键字来查找我的结果。但是 keywords 是多对多的字段。

数据库架构

【问题讨论】:

  • 你想要原始的sql 或 django orm 查询?
  • 我想查询类似 'SELECT id,name,( 3959 * acos ( cos ( 弧度(30.696627)) * cos( 弧度( lat ) ) * cos( 弧度( lng ) - 弧度(76.693764) ) + sin ( 弧度(30.696627) ) * sin( 弧度( lat ) ) ) AS 距离和关键字 =burger FROM newbackend_restaurant' 如果可以使用 Django 查询,那会很好,否则我会考虑原始 sql 查询

标签: mysql sql django postgresql django-models


【解决方案1】:

ManyToManyFieldDjango 会自动生成一个表来管理多对多关系。

因此,根据您的模型,我认为原始 sql 将如下所示:

SELECT r.id,
       r.name,
       ( 3959 * acos ( cos ( radians(30.696627)) * cos( radians( lat ) ) * cos( radians( lng ) - radians(76.693764) ) + sin ( radians(30.696627) ) * sin( radians( lat ) ) ) ) AS distance
FROM newbackend_restaurant r
    LEFT JOIN newbackend_restaurantrestaurantkeyword m2m
        ON m2m.restaurant_id = r.id
    LEFT JOIN newbackend_restaurantkeyword rk
        ON m2m.restaurantkeyword_id = rk.id
WHERE rk.keywords IN ('WORD', 'HELLO');

希望您可以自己修复字段和表名。

【讨论】:

  • 谢谢 这个查询在 SQL 命令中运行良好,但在 Django 中,它显示错误 raise InvalidQuery('Raw query must include the primary key') 但是当我在那里使用 id 时,它会显示类似 django 的错误。 db.utils.ProgrammingError: 列引用“id”不明确 LINE 1: SELECT id,name( 3959 * Acos(Cos(Radians(30.696627)) * Cos(Ra...
  • 很高兴为您提供帮助。如果一切正常,您可以并且应该接受答案)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多