Необработанный запрос Django объединяет множество полей - PullRequest
0 голосов
/ 27 августа 2018

Models.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, keyword.Мне нужен запрос там, я могу использовать ключевые слова, чтобы найти свой результат. Но ключевые слова много для многих полей.

Схема БД

enter image description here

1 Ответ

0 голосов
/ 27 августа 2018

от ManyToManyField Django автоматически сгенерирует таблицу для управления отношениями "многие ко многим".

Итак, основываясь на ваших моделях, я думаю, что raw 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');

Надеюсь, вы можете исправить поля и имена таблиц самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...