0

我在 views.py 中收到以下错误,但我无法找出原因。请帮忙。

Request Method: GET
Request URL:    http://localhost:8000/tribalrights/

Django Version: 1.3.1
Exception Type: AttributeError
Exception Value:    'NoneType' object has no attribute 'all'
Exception Location: /home/gunjan/tribalrights/tr/views.py in home, line 70
Python Executable:  /usr/bin/python
Python Version: 2.7.3

下面是在 views.py 中调用的函数。第 70 行开始于声明的下一行。

def home(request):
    atrocities = Atrocity.objects.all()
    cities = City.objects.all()
    for atrocity in atrocities:
       #this is line 69.below is line 70. 
       cities = atrocity.location.all()
    return render_to_response('tr/home.html', {
            'cities' : cities,
        })

下面是 models.py 中 City 和 Atrocity 属性的定义

class Atrocity(models.Model):
    name = models.CharField(max_length=255)
    dateTimeOccurred = models.DateTimeField ( null=True, blank=True )
    persons = models.ManyToManyField ( Person, null=True, blank=True )
    atrocityType = models.ForeignKey(AtrocityType)
    description = models.CharField(max_length=255)
    location = models.ForeignKey(City, null=True, blank=True)
    def __unicode__(self):
        return self.name

class City(models.Model):
    name = models.CharField(max_length=255)
    district = models.ForeignKey(District)
    latitude = models.DecimalField(max_digits=13, decimal_places=10, null=True, blank=True)
    longitude = models.DecimalField(max_digits=13, decimal_places=10, null=True, blank=True)
    def __unicode__(self):
        return self.name
4

3 回答 3

1

atrocity.location是 a ForeignKey,所以它指向一个City。使用您当前的模型,您应该只使用 city = atrocity.location检索与Atrocity. 您.all()在表示一堆对象的管理器对象上使用,例如City.objects,但您的location字段只是一个对象。

如果您希望该Atrocity.location字段代表许多城市,那么您可以使用

location = models.ManyToManyField(City)

并调用atrocity.location.all()以获取所有位置城市atrocity

编辑:从您的代码看来,您可能正在尝试获取所有城市的列表,这些城市是 some 的位置Atrocity?如果是这种情况,您可以使用

cities = list(set(map(lambda a: a.location, Atrocity.objects.all()))

并传递cities到您的模板中。这将获取location每个Atrocity对象的 ,并将它们组合成一个集合以删除重复项。

于 2012-12-18T16:37:37.300 回答
0

位置是外键。外键仅引用一个模型。那么你的代码就没有意义了,因为.all()方法是针对查询集的。应该只是:

cities = atrocity.location
于 2012-12-18T16:31:53.013 回答
0

你在做什么是错误的。有一个外键关系,所以每个暴行只与一个位置有关。所以,你不能全部使用

例子:

#Each Atrocity is related to only one location
city = atrocity.location

#Each can be related to more than one atrocity
atrocities = location.atrocity_set.all()

而不是循环遍历每个 Atrocity 对象来收集城市。在数据库级别执行此操作会更有效。您可以通过此在 City 和 Atrocity 之间进行连接查询。

cities = City.objects.filter(id__in = Atrocity.objects.values_list('location', flat=True))
于 2012-12-18T16:34:15.010 回答