中级模型Django ORM

时间:2012-09-29 16:11:09

标签: django code-snippets django-orm

我创建了我的经理车库和汽车。 我正在试图计算目前车库里所有车辆的货币价值。

class Car(models.Model):
    name = models.CharField(max_length=50)
    price = models.DecimalField()    

class GarageCar(models.Model):
    car = models.ForeignKey('Car')
    how_much = models.IntegerField()

class Garage(models.Model):
    name = models.CharField("Garage_Name", max_length=30)
    cars = models.ManyToManyField('GarageCar', blank=True, null=True)

我尝试这样的事情:

def price_of_cars(request):

    garages = Garage.objects.filter(..) #

    total_price_of_cars_in_this_garages = 0
    for a in garages:
        for p in garages.cars:
            total_price_of_cars_in_this_garages += (p.price * how_much)


    return render_to_response('garage.html',
    {'total_price_of_cars': total_price_of_cars_in_this_garages})

但返回:语法错误,如果我删除how_much则返回错误:'ManyRelatedManager'对象不可迭代

1 个答案:

答案 0 :(得分:3)

您的命名系统非常混乱。 garage.cars令人困惑,因为有一个汽车模型,但它意味着一个不同的模型。 how_much令人困惑,因为我认为你的意思是quantity,虽然它看起来应该是一个代价。

也就是说,你得到的第一个错误是因为how_much不在price_of_cars的范围内。它是GarageCars模型的属性。

接下来,您无法像这样迭代cars,它是一名经理。您必须使用cars.all()cars.filter(..)

最后,price不是cars的属性,它是一个GarageCar对象,而不是Car对象(请参阅我说的名称如何使其更多令人困惑?)因此我们需要将p.price更改为p.car.price

所以把它放在一起,你应该得到这样的东西:

def price_of_cars(request):
    garages = Garage.objects.filter(..) #

    total_price_of_cars_in_this_garages = 0
    for a in garages:
        for p in garages.cars.all():   # changed to use .all()
            total_price_of_cars_in_this_garages += (p.car.price * p.how_much) # changed to use correct properties (hopefully!)