我想做Winerama推荐人。我遇到了一个我解决不了的错误。当我试图转到“推荐列表”选项卡时,浏览器返回以下错误。在
错误
Environment:
Request Method: GET
Request URL: http://127.0.0.1:8000/recommendation/
Django Version: 2.0.7
Python Version: 3.7.0
Installed Applications:
['django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'bootstrap3',
'reviews',
'registration']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware']
Traceback:
File "C:\Users\tymot\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\exception.py" in inner
35. response = get_response(request)
File "C:\Users\tymot\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response
128. response = self.process_exception_by_middleware(e, request)
File "C:\Users\tymot\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\core\handlers\base.py" in _get_response
126. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Users\tymot\AppData\Local\Programs\Python\Python37-32\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
21. return view_func(request, *args, **kwargs)
File "C:\Users\tymot\Desktop\Cd-12.50-20.08\env\my_app\winerama\reviews\views.py" in user_recommendation_list
89. reverse=True
Exception Type: TypeError at /recommendation/
Exception Value: '<' not supported between instances of 'method' and 'method'
我根据教程中的步骤创建了所有内容。在
文件模型.py
^{pr2}$接下来我添加了管理员py并使用'/admin'中的用户创建3个klaster。在
from django.contrib import admin
from .models import Wine, Review, Cluster
class ReviewAdmin(admin.ModelAdmin):
model = Review
list_display = ('wine', 'rating', 'user_name', 'comment', 'pub_date')
list_filter = ['pub_date', 'user_name']
search_fields = ['comment']
class ClusterAdmin(admin.ModelAdmin):
model = Cluster
list_display = ['name', 'get_members']
admin.site.register(Wine)
admin.site.register(Review, ReviewAdmin)
admin.site.register(Cluster, ClusterAdmin)
我的文件视图.py
@login_required
def user_recommendation_list(request):
# get request user reviewed wines
user_reviews = Review.objects.filter(user_name=request.user.username).prefetch_related('wine')
user_reviews_wine_ids = set(map(lambda x: x.wine.id, user_reviews))
# get request user cluster name (just the first one righ now)
user_cluster_name = \
User.objects.get(username=request.user.username).cluster_set.first().name
# get usernames for other memebers of the cluster
user_cluster_other_members = \
Cluster.objects.get(name=user_cluster_name).users \
.exclude(username=request.user.username).all()
other_members_usernames = set(map(lambda x: x.username, user_cluster_other_members))
# get reviews by those users, excluding wines reviewed by the request user
other_users_reviews = \
Review.objects.filter(user_name__in=other_members_usernames) \
.exclude(wine__id__in=user_reviews_wine_ids)
other_users_reviews_wine_ids = set(map(lambda x: x.wine.id, other_users_reviews))
# then get a wine list including the previous IDs, order by rating
wine_list = sorted(
list(Wine.objects.filter(id__in=other_users_reviews_wine_ids)),
key=lambda x: x.average_rating,
reverse=True
)
return render(
request,
'reviews/user_recommendation_list.html',
{'username': request.user.username, 'wine_list': wine_list}
)
我会指出,当我尝试使用简单版本时,一切正常。在
@login_required
def user_recommendation_list(request):
# get this user reviews
user_reviews = Review.objects.filter(user_name=request.user.username).prefetch_related('wine')
# from the reviews, get a set of wine IDs
user_reviews_wine_ids = set(map(lambda x: x.wine.id, user_reviews))
# then get a wine list excluding the previous IDs
wine_list = Wine.objects.exclude(id__in=user_reviews_wine_ids)
return render(
request,
'reviews/user_recommendation_list.html',
{'username': request.user.username,'wine_list': wine_list}
)
我的错误在教程的这个stage (2.5)。第2.4阶段效果良好。 一切都表明视图.py. 在
任何帮助都将不胜感激。在
^{} 函数接受返回值的函数
key
。似乎x.average_评级是方法,而不是值。所以你有两个选择方法与方法返回的值之间存在差异。在您的
Wine
模型中,我们看到:(我重写了它以进行效率查询,而不是Python/Django/Numpy-let来做这项工作)。在
如果现在有一个名为
some_wine
的Wine
对象,那么这里的some_wine.average_rating
并没有得到平均评级,因为这将返回一个方法,而是通过调用函数,所以some_wine.average_rating()
。在这里有一些选项:
调用lambda表达式中的函数:
将方法定义为一个属性,在这种情况下,您不再调用函数,它是幕后调用的,因此:
使用
Wine.average_rating
作为键,因为它是一个名为并带有实例的函数:使用
.annotate(..)
对数据库中已有的Wine
对象排序:最新的方法可能是最有效的,因为数据库通常针对此类查询进行优化,而且这将通过一个单个查询来实现。在
相关问题 更多 >
编程相关推荐