【问题标题】:AttributeError: 'DeferredAttribute' object has no attribute 'objects'AttributeError:“DeferredAttribute”对象没有属性“对象”
【发布时间】:2017-09-13 02:06:12
【问题描述】:

我收到一个错误,AttributeError: 'DeferredAttribute' 对象没有属性 'objects'。 我想解析excel并将其放入模型(City&Prefecture&Area&User)。我写了

user3 = User.objects.filter(corporation_id=val3).first()
if user3:
   area = Area.objects.filter(name="America").first()
   pref = Prefecture.objects.create(name="prefecture", area=user3.area)
   city = City.objects.create(name="city", prefecture=pref)
   price_u1000 = Price.upper1000.objects.get(city=city)
   price_500_1000 = Price.from500to1000.objects.get(city=city)
   price_u500 = Price.under500.objects.get(city=city)

   pref.name = "NY"
   pref.save()

   for i in range(2,len(fourrows_transpose)):
       city.name = fourrows_transpose[i][1]
       city.save()
       print(fourrows_transpose[i][1])

       price_u1000.name = fourrows_transpose[i][2]
       price_u1000.save()
       print(fourrows_transpose[i][2])

       price_500_1000.name = fourrows_transpose[i][3]
       price_500_1000.save()
       print(fourrows_transpose[i][3])

       price_u500.name = fourrows_transpose[i][4]
       price_u500.save()
       print(fourrows_transpose[i][4])

Traceback 说这个代码price_u1000 = Price.upper700.objects.get(city=city) 是错误的。 models.py 是

class Area(models.Model):
    name = models.CharField(max_length=20, verbose_name='area', null=True)
class User(models.Model):
    user_id = models.CharField(max_length=200,null=True)
    area = models.ForeignKey('Area',null=True, blank=True)

class Prefecture(models.Model):
    name = models.CharField(max_length=20, verbose_name='prefecture')
    area = models.ForeignKey('Area', null=True, blank=True)

class City(models.Model):
    name = models.CharField(max_length=20, verbose_name='city')
    prefecture = models.ForeignKey('Prefecture', null=True, blank=True)

class Price(models.Model):
    upper1000 = models.CharField(max_length=20, verbose_name='u1000', null=True)
    from500to1000 = models.CharField(max_length=20, verbose_name='500~1000', null=True)
    under500 = models.CharField(max_length=20, verbose_name='d500', null=True)
    city = models.ForeignKey('City', null=True, blank=True)

我应该怎么做才能解决这个问题?我应该怎么写?

【问题讨论】:

    标签: python django


    【解决方案1】:

    这是因为upper1000 或任何字段没有属性对象。对象存在于模型类中。

    如果upper1000、from500to1000 和under500 是互斥的,你可以这样做。但请记住,如果是这种情况,您应该在模型清理函数中处理互斥性。

    price_u1000 = Price.objects.filter(city=city, upper1000__isnull=False, from500to1000__isnull=True, under500__isnull=True)
    

    我建议创建一个选择字段,而不是 3 个似乎互斥的不同字段

    class Price(models.Model):
    
        UNDER_500 = 'under 500'
        FROM_500_TO_1000 = 'from 500 to 1000'
        UPPER_1000 = 'upper 1000'
    
        PRICE_CHOICES = [
            (UNDER_500, pgettext_lazy('Price under 500')),
            (FROM_500_TO_1000, pgettext_lazy('Price from 500 to 1000')),
            (UPPER_1000, pgettext_lazy('Price above 1000'))
        ]
    
        price_range = models.CharField(
            verbose_name=ugettext_lazy('Price range'),
            max_length=25,
            choices=PRICE_CHOICES,
            default=UNDER_500
        )
    
        city = models.ForeignKey('City', null=True, blank=True)
    
        def clean(self):
            super(Price, self).clean()
            # implement extra constraints here.
    

    一些读数: https://docs.djangoproject.com/en/1.11/ref/models/querysets/

    【讨论】:

    • 谢谢你的 cmets。我不想排他从 500 到 1000 和 under500 如果上 1000。我想把这些模型放到数据中。
    • 好的,但是第一句话解释了你的问题,第一个查询是你应该如何从模型中查询数据。请记住在查询此类数据时使用过滤器,因为除了 id/pk 之外的任何字段都没有 unique=True。因此,您必须期望从查询中返回不止一行。
    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 2018-08-28
    相关资源
    最近更新 更多