我已经能够通过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.>]
答案 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对象进行比较。将对象与对象或属性与属性进行比较。