【问题标题】:Django queryset returning nothing but []Django 查询集只返回 []
【发布时间】:2010-02-17 21:50:46
【问题描述】:

我已经能够通过 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 模型中返回与当前 Shoe 匹配的所有 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.>]

【问题讨论】:

  • 我建议在尝试解决任何严重的编码问题之前先睡觉。
  • 你在 shell 中尝试过ariake.ownerreview_set.all() 吗?

标签: django django-models django-queryset


【解决方案1】:
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)

我的示例假设您已将模型中的字段名称从“Shoe”切换为“shoe”。

【讨论】:

    【解决方案2】:

    您得到一个空 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 对象进行比较。要么将对象与对象进行比较,要么将属性与属性进行比较。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2018-12-01
      • 2011-04-26
      • 2014-08-24
      • 2021-02-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多