Django 性能与“不在”过滤器与巨型列表?
Django performance with `not in` filter with giant list?
我目前正在做一个学校项目,我正在建立一个网站,让您对附近的餐馆进行评分(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)
如果您认识到这里是用户和餐厅之间的多对多关系,并且具有 table 的评级,您可以使查询变得更加容易。所以:
class User(models.Model):
...
ratings = models.ManyToManyField('Restaurant', through='Rating', related_name='users_rating')
这实际上并没有太大改变这个查询 - 现在是:
Restaurant.objects.exclude(users_rating=request.user)
但它肯定会使其他查询更容易。
我目前正在做一个学校项目,我正在建立一个网站,让您对附近的餐馆进行评分(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)
如果您认识到这里是用户和餐厅之间的多对多关系,并且具有 table 的评级,您可以使查询变得更加容易。所以:
class User(models.Model):
...
ratings = models.ManyToManyField('Restaurant', through='Rating', related_name='users_rating')
这实际上并没有太大改变这个查询 - 现在是:
Restaurant.objects.exclude(users_rating=request.user)
但它肯定会使其他查询更容易。