Django表现与`不在'过滤器与巨型列表?

时间:2017-05-09 14:43:18

标签: 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来过滤现有的评分,那么可能会遇到性能问题

1 个答案:

答案 0 :(得分:3)

您需要的查询是排除用户已评级的餐馆的查询。如果你这样做,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)

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