mysql - 带有 `not in` 过滤器和巨型列表的 Django 性能?

标签 mysql django django-models django-orm

我目前正在做一个学校项目,我正在建立一个网站,让你评价附近的餐馆(1-5 星)。唯一需要注意的是,我会根据位置向用户显示餐厅(例如,首先显示最近的餐厅),一旦他们对餐厅进行了评分,就不会再向他们显示。

目前我有这样的想法

class User(models.Model):
    username = models.CharField(primary_key=True, max_length=20)
    location = models.SomeGeoPointField
    ...

class Restaurant(models.Model):
    title = models.CharField(primary_key=True, max_length=20)
    location = models.SomeGeoPointField
    ...

class Rating(models.Model):
    for    = models.ForeignKey(User, on_delete=models.CASCADE)
    from   = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    rating = models.IntegerField()

我无法思考查询的外观,如果我使用 not in 来过滤掉现有的评级,关于可能的性能影响

最佳答案

您需要的查询排除了用户已经评价过的餐厅。如果您这样做,Django 将创建一个高效的查询:

Restaurant.objects.exclude(rating__user=request.user)

如果您认识到此处拥有的是用户和餐厅之间的多对多关系,并且带有评级表,您可以使查询变得更加容易。所以:

class User(models.Model):
    ...
    ratings = models.ManyToManyField('Restaurant', through='Rating', related_name='users_rating')

这实际上并没有太大改变这个查询——现在是:

Restaurant.objects.exclude(users_rating=request.user)

但它肯定会使其他查询更容易。

关于mysql - 带有 `not in` 过滤器和巨型列表的 Django 性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43872910/

相关文章:

javascript - 仅在 JQuery、PHP、MySQL 上仅在最后一个 KeyUp 上自动保存。如何?

php - 如何使用 PHP 获取每页上的列总和?

javascript - 如何更改 reCaptcha 的样式,如 stackoverflow 和 facebook

Django 和 docker : Should we use python virtualenv

具有多个值的 PHP PDO-MySQL 准备好的语句

mysql - 我已经安装了 ubuntu 和 mysql 。下面的错误不断出现

python - Django 忽略来自第三方模块的翻译字符串

python - 将通过 PIL 创建的图像保存到 django 模型

python - Django反向外键导致重复查询

database - Django ORM 模型对象的主键中的空值