order_by () не работает при вызове функции, которая возвращает QuerySet - PullRequest
0 голосов
/ 30 января 2012

У меня проблема с тем, чтобы заставить мой django заказать работу. Когда я определяю функцию в определении модели, которая возвращает QuerySet с вызовом order_by(), я получаю правильный порядок. Однако, когда я звоню order_by() за пределами определения, я не получаю правильный порядок.

рабочий код:

Следующие «детали» правильно упорядочены по имени:

# models.py
class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True, default=0)
    ...
    def get_parts_as_owner(self):
        user=self.user
        return Part.objects.filter(Q(owner=user)).order_by('name')

class Part(models.Model):
    name = models.CharField(max_length=45,unique=True)
    last_modified = models.DateTimeField(auto_now=True)
    owner = models.ForeignKey(User)

# views.py
def view_parts(request):
    user = request.user
    owned = user.get_profile().get_parts_as_owner()
    return render_to_response('parts/view_parts.html', {'owned': owned}, RequestContext(request))

не работает код:

следующее не упорядочено, как я ожидал (по имени):

# models.py
class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True, default=0)
    ...
    def get_parts_as_owner(self):
        user=self.user
        return Part.objects.filter(Q(owner=user))

class Part(models.Model):
    name = models.CharField(max_length=45,unique=True)
    last_modified = models.DateTimeField(auto_now=True)
    owner = models.ForeignKey(User)

# views.py
def view_parts(request):
    user = request.user
    owned = user.get_profile().get_parts_as_owner().order_by('name')
    return render_to_response('parts/view_parts.html', {'owned': owned}, RequestContext(request))

также не работает

Следующие заказы по имени, а не по last_modified, что я ожидаю

# models.py
class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True, default=0)
    ...
    def get_parts_as_owner(self,order='name'):
        user=self.user
        return Part.objects.filter(Q(owner=user)).order_by(order)

class Part(models.Model):
    name = models.CharField(max_length=45,unique=True)
    last_modified = models.DateTimeField(auto_now=True)
    owner = models.ForeignKey(User)

# views.py
def view_parts(request):
    user = request.user
    owned = user.get_profile().get_parts_as_owner(order='last_modified')
    return render_to_response('parts/view_parts.html', {'owned': owned}, RequestContext(request))

Почему это не так, как я ожидал? Какая разница, когда я звоню order_by?

1 Ответ

0 голосов
/ 30 января 2012

Вы должны использовать связанные менеджеры вместо того, чтобы создавать методы в модели для возврата совершенно нового набора запросов.Например, чтобы получить детали пользователя, вам нужно всего лишь:

request.user.get_profile().part_set.order_by('name')

Это встроено для вас.Больше ничего не нужно делать.

...