Django/Python unorderable types: complex() < complex() -
'm learning django , python tutorial, , of time there bugs between different version of django or python.
i ran problem "unorderable types: complex() < complex()" because of :
def top_stories(top=180, consider=1000): latest_stories = story.objects.all().order_by('-created_at')[:consider] ranked_stories = sorted([(score(story), story) story in latest_stories], reverse=true) return [story score, story in ranked_stories][:top]
i found solution said: use key function give stores score: ranked_stories = sorted(latest_stories, key=score, reverse=true) return ranked_stories[:top]
but, wasn't working because of older version, told me try
"yes, has changed bit. have specify lambda sorting because key has callable. using lambda makes callable on every item of iterable object using - ensuring key can used across kind of object instances own classes.
try following:
ranked_stories = sorted(latest_stories, key=lambda story: store.score(), reverse=true)
you may make complex want using score object , that's beauty of lambda"
this didn't work. gave me error saying "'queryset' object has no attribute 'points'".
my model have points variable, don't under stand why it's yelling @ me. see what's wrong code?
here views.py code:
import datetime django.shortcuts import render, get_object_or_404 django.http import httpresponseredirect, httpresponse django.utils.timezone import utc django.contrib.auth.decorators import login_required stories.models import story def score(story, gravity=1.8, timebase=120): points = (story.points - 1)**0.8 = datetime.datetime.utcnow().replace(tzinfo=utc) age = int((now - story.created_at).total_seconds())/60 return points/(age+timebase)**1.8 def top_stories(top=180, consider=1000): latest_stories = story.objects.all().order_by('-created_at')[:consider] ranked_stories = sorted(latest_stories, key=lambda story: latest_stories.points, reverse=true) return ranked_stories[:top] def index(requet): stories = top_stories(top = 30) response =''' <html> <head> <title>tuts+ news</title> </head> <body> <ol> </ol> </body> </html> ''' % '\n'.join(['<li> %s </li>' % stories.title story in stories]) return httpresponse(response)
and here models.py code:
from django.db import models urllib.parse import urlparse django.contrib.auth.models import user class story(models.model): title = models.charfield(max_length = 200) url = models.urlfield() points = models.integerfield(default = 1) moderator = models.foreignkey(user, default = '') created_at = models.datetimefield(auto_now_add = true) updated = models.datetimefield(auto_now = true) def __str__(self): return self.title @property def domain(self): return urlparse(self.url).netloc class meta: verbose_name_plural = 'stories'
latest_stories
queryset
. meant use lambda argument instead.
key=lambda story: story.points
Comments
Post a Comment