Набор запросов Django, не возвращающий ничего, кроме [] - PullRequest
0 голосов
/ 18 февраля 2010

Я смог сделать это через оболочку окружения django, но не работал на моем реальном сайте. Вот моя модель:

class ShoeReview(models.Model):
        def __unicode__(self):
                return self.title
        title = models.CharField(max_length=200)
        slug = models.SlugField(unique=True)
        keywords = models.TextField()
        author = models.ForeignKey(User, related_name='reviews')
        pub_date = models.DateTimeField(auto_now_add='true')
        Shoe = models.OneToOneField(Shoe) # make this select those without a shoe review in admin area
        owner_reviews = OwnerReview.objects.filter(Shoe__name=Shoe)

Я уверен, что это что-то глупое, но я занимался этим около 6 часов. Это одна из причин, почему я не спал последние 18 лет: S

Я пытаюсь вернуть все объекты OwnerReview из модели OwnerReview, соответствующие текущей обуви:

class OwnerReview(models.Model):
        def __unicode__(self):
                return self.comments
        name = models.CharField(max_length=50)
        pub_date = models.DateTimeField(auto_now_add='true')
        Shoe = models.ForeignKey(Shoe)
        email = models.EmailField()
        rating = models.PositiveSmallIntegerField()
        comments = models.CharField(max_length=500)

Вот что я пытаюсь выполнить с помощью «оболочки python manage.py»:

>>> from runningshoesreview.reviews.models import Shoe, OwnerReview
>>> ariake = Shoe.objects.get(pk=1)
>>> ariake.name
u'Ariake'
>>> owner_reviews_for_current_shoe = OwnerReview.objects.filter(Shoe__name=ariake.name)
>>> owner_reviews_for_current_shoe
[<OwnerReview: great pk shoe!>, <OwnerReview: good shoes, sometimes tear easy though.>]

Ответы [ 2 ]

2 голосов
/ 18 февраля 2010
ariake = Shoe.objects.get(pk=1)
# get the OwnerReviews 
ariake.ownerreview_set.all()
# or the ShoeReviews
akiake.shoereview_set.all()

Или, если вы действительно хотите использовать класс OwnerReview напрямую

OwnerReview.objects.filter(shoe=ariaki)

Вопрос к вам. Вы хотели использовать OnoToOneField (Shoe), а не ForeignKey (Shoe) в классе ShoeReview? ForeignKey имеет больше смысла для меня. Я бы выделил поле «Чистка» в обеих ваших моделях обзора и удалил ссылку на OwnerReview в ShoeReview.

class ShoeReview(models.Model):
    # ...
    shoe = models.ForeignKey(Shoe)
    #^^^ lowercase field and ^^^^ capitalized model 
    # VVV remove this next line VVV
    #owner_reviews = OwnerReview.objects.filter(Shoe__name=Shoe)

В моем примере предполагается, что вы переключились с «Обувной» на «Обувной» для названия поля в ваших моделях.

0 голосов
/ 18 февраля 2010

Причина, по которой вы получаете пустой QuerySet, в том, что в вашей модели ShoeReview ваш аргумент фильтра неверен:

owner_reviews = OwnerReview.objects.filter(Shoe__name=Shoe)

Изменить на это:

owner_reviews = OwnerReview.objects.filter(Shoe=Shoe) #without __name или вы можете сделать так же: owner_reviews = OwnerReview.objects.filter(Shoe__name=Shoe.name)

Дело в том, что вы не можете сравнить атрибут name с объектом Shoe. Либо сравните объект с объектом, либо атрибут с атрибутом.

...