【问题标题】:Reverse Relationship in django 'QuerySet' object has no attribute 'name'django'QuerySet'对象中的反向关系没有属性'name'
【发布时间】:2020-10-29 00:52:04
【问题描述】:

我有两个模型,称为汽车和生产者。这两个模型之间具有多对一的关系。

class Producer(models.Model):
    name = models.CharField(max_length=30)

    def __str__(self):
        return self.name

class Car(models.Model):
    name = models.CharField(max_length=20)
    producer = models.ForeignKey(Producer, on_delete=models.CASCADE)

    def __str__(self):
        return self.name here

当我尝试查询反向关系时。

Producer.objects.filter(car__name='Mini')

然后它返回一个查询集对象

<QuerySet [<Producer: BMW>]>

当我尝试将查询集对象分配给变量并获取名称字段结果时,它会出错。

obj1 = Producer.objects.filter(car__name='Mini')
    In [6]: obj1.name                                                                                                                                                                   
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-6-5155cb2773b4> in <module>
----> 1 obj1.name

AttributeError: 'QuerySet' object has no attribute 'name'

这个错误可能是什么原因

【问题讨论】:

    标签: python django django-models orm


    【解决方案1】:

    Queryset 是一个对象列表,而不是单个对象。

    所以你可以这样做:

    obj1 = Producer.objects.filter(car__name='Mini').first(). # <- get first
    In [6]: obj1.name  
    

    或者如果您必须处理多个。

    for obj in obj1:
        print(obj.name)
        # do your logic
    

    【讨论】:

      【解决方案2】:

      你什么时候使用get()Django返回一个对象,你可以得到那个对象的变量,例如obj1.name,但是当你使用filter时,Django返回一个Queryset,你必须迭代带有 for 的查询集:

      mini_producers = Producer.objects.filter(car__name='Mini')
      
      for producer in mini_producers:
          print(producer.name)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 2021-08-05
        • 2017-04-15
        • 1970-01-01
        • 1970-01-01
        • 2021-10-22
        • 2021-05-06
        相关资源
        最近更新 更多