Django查询集只返回[]

时间:2010-02-17 21:50:46

标签: django django-models django-queryset

我已经能够通过django环境shell执行此操作,但是在我的实际站点上没有工作。这是我的模特:

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 shell”完成的工作:

>>> 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 个答案:

答案 0 :(得分:2)

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)

给你一个问题。你的意思是在ShoeReview类中使用OnoToOneField(Shoe)而不是ForeignKey(Shoe)吗? ForeignKey对我来说更有意义。我会在两个评论模型中小写“Shoe”字段,并删除对ShoeReview中的OwnerReview的引用。

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)

我的示例假设您已从“鞋子”切换为“鞋子”以获取模型中的字段名称。

答案 1 :(得分:0)

您获取空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对象进行比较。将对象与对象或属性与属性进行比较。

相关问题