Помощь по моим моделям Django для моего сайта обзора обуви - PullRequest
2 голосов
/ 04 марта 2010

Чего я сейчас пытаюсь достичь:

  • Позвольте мне добавить новые объекты обуви и объекты обзора обуви. полная
  • Разрешить "Отзывы владельцев" на каждой обуви завершено (думаю, но в моей модели может быть что-то, что я могу улучшить)
  • Разрешить оценки атрибутов, определенных мной, которые связаны с конкретной обуви. Предпочтительно иметь простой способ перебора всех полей рейтинга, относящихся к конкретной обуви.
  • Моя общая цель - сделать так, чтобы можно было легко предлагать обувь с характеристиками, аналогичными тем, которые пользователь оценивал в прошлом. Затем разрешается фильтровать эти обзоры обуви по бренду, цене, сортировке по максимуму / минимуму на основе рейтинга атрибутов, а также использовать эти параметры сортировки на основе действий (тегов), для которых используется обувь.

Я чувствую, что я рядом, но что-то упускаю из отношений, которые мне нужны. Было бы очень удобно использовать следующее, чтобы получать обзоры обуви с высоким рейтингом.

ShoeReview.objects.filter(owner_review__ratings__rating_attribute = 'overall').sort_by(owner_review__ratings__rating)

Я думаю, что это правильно? Опять же, новое в Django, так что, пожалуйста, прости любые глупые ошибки. Как всегда, я несколько дней разбирался со своим кодом, прежде чем спрашивать здесь, так что не думайте, что я просто опубликовал это, не прилагая собственных усилий.

Вот содержимое файла models.py:

from django.db import models
from django.contrib.auth.models import User
from tagging.fields import TagField

class Brand(models.Model):
        def __unicode__(self):
                return self.name
        name = models.CharField(max_length=200)
        popularity = models.PositiveIntegerField(default=0)

class Shoe(models.Model):
        def __unicode__(self):
                return self.name
        brand = models.ForeignKey(Brand)
        name = models.CharField(max_length=200)
        description = models.TextField()
        price = models.PositiveIntegerField()
        buylink = models.URLField(verify_exists='true', default="http://www.amazon.com/gp/redirect.html?ie=UTF8&location=http%3A%2F%2Fwww.amazon.com%2FAthletic-Outdoor%2Fb%3Fie%3DUTF8%26node%3D679564011%26ref_%3Damb%5Flink%5F23091522%5F13&tag=runnshoerevi-20&linkCode=ur2&camp=1789&creative=390957", max_length=400)
        picture = models.ImageField(upload_to='shoes', blank=True, default="shoes/default_picture.jpg")
        youtube_video_id = models.CharField(max_length=25, blank=True)

class RatingAttributes(models.Model):
        def __unicode__(self):
                return self.attribute
        attribute = models.CharField(max_length=65)

class Rating(models.Model):
        def __unicode__(self):
                return "%s, %s: %s" % (str(self.author), str(self.rating_attribute), str(self.rating))

        rating_attribute = models.ForeignKey(RatingAttributes)
        author = models.ForeignKey(User)
        pub_date = models.DateTimeField(auto_now_add='true')
        rating = models.IntegerField(blank=True, null=True)

class OwnerReview(models.Model):
        def __unicode__(self):
                return self.comments
        author = models.ForeignKey(User)
        pub_date = models.DateTimeField(auto_now_add='true')
        shoe = models.ForeignKey(Shoe)
        youtube_video_id = models.CharField(max_length=25, blank=True)
        comments = models.TextField()
        # this field will be increased every time a user clicks "this review was helpful and all reviws will be sorted by the helpfulness value
        ratings = models.ForeignKey(Rating)
        helpfulness = models.IntegerField(default=0, blank=True)

class ShoeReview(models.Model):
        def __unicode__(self):
                return self.title
        pub_date = models.DateTimeField(auto_now_add='true')
        author = models.ForeignKey(User, related_name='reviews')
        title = models.CharField(max_length=200)
        keywords = models.CharField(max_length=800, blank=True, default="Shoe Review")
        slug = models.SlugField(unique=True)
        cur_shoe = models.ForeignKey(Shoe)
        staff_opinion = models.TextField()
        owner_review = models.ForeignKey(OwnerReview)
        shoe_activities = TagField()

Ответы [ 2 ]

1 голос
/ 22 декабря 2011

Вы должны сделать:

ShoeReview.objects\
          .filter(owner_review__ratings__rating_attribute__attribute='overall')\
          .order_by(owner_review__ratings__rating)

Но на самом деле вам лучше использовать менеджера:

class BestShoesReviewManager(models.Manager):
    def get_query_set(self):
        qs =  super(DahlBookManager, self).get_query_set()
        return qs.filter(owner_review__ratings__rating_attribute__attribute= 'overall')\
                 .order_by(owner_review__ratings__rating)

Таким образом, вы можете сделать:

class ShoeReview(models.Model)

    objects = models.Manager() # The default manager.
    best = BestShoesReviewManager() # The best review manager.

И так в вашем коде вы можете сделать это:

ShoeReview.objects.best()
1 голос
/ 04 марта 2010

Вместо этого:

ShoeReview.objects.filter(owner_review__ratings__rating_attribute = 'overall').sort_by(owner_review__ratings__rating)

Вам следует позвонить:

ShoeReview.objects.filter(owner_review__ratings__rating_attribute__attribute = 'overall').order_by(owner_review__ratings__rating)

owner_review__ratings__rating_attribut ожидает модель (она извлечет pk из модели и использует ее в запросе). Также есть метод order_by, а не sort_by. Рядом с этим запросом все в порядке. Попробуйте запустить его и скажите, если вы получите результаты или есть какие-то ошибки. Попробуйте запустить его в ./manage.py shell, это позволит легко и быстро проверить, работает ли он.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...