Django Model.objects.all()和Model.objects.get(pk =?)返回两个不同的结果

时间:2013-11-15 11:17:38

标签: django google-cloud-datastore django-nonrel

我有一个名为Restaurant

的基本模型
class Restaurant(models.Model):
    place = models.OneToOneField(Place, primary_key=True)
    serves_pizza = models.BooleanField()
    serves_hotdog = models.BooleanField()

    def __unicode__(self):
        return u'%s the restaurant' % self.place.name

使用Restaurant.objects.all()Restaurant.objects.get()进行查询会产生两种不同的结果,其中只有前者是正确的。

# this is correct
>>> r=Restaurant.objects.all()
>>> r
[<Restaurant: Hogwarts the restaurant>, <Restaurant: Domino the restaurant>]
>>> r[0].serves_hotdog
True

# this is not correct
>>> r0=Restaurant.objects.get(pk=4556376185503744)
>>> r0.serves_hotdog
False

# although they have the same pk
>>> r0.pk == r[0].pk
True
# their property values are different
>>> r[0].serves_hotdog == r0.serves_hotdog
False
>>> r[0].serves_pizza == r0.serves_pizza
False

有没有人见过类似的东西?

1 个答案:

答案 0 :(得分:2)

如果您在GAE上使用Django-nonrel,请确保没有为相关模型设置primary_key=True,因为引擎将为两个模型使用相同的主键。例如,就我而言,我有RestaurantPlace OneToOneRelationship。如果我们使用Place作为Restaurant的主键,则从地点对象创建的餐馆对象将共享相同的pk,从而弄乱Restaurant.objects.get(pk=)

删除主键规则可以解决我的问题:

class Restaurant(models.Model):
    place = models.OneToOneField(Place) # no primary_key=True

我在其他地方找不到这些信息,所以我在这里发布。希望它可以帮助别人。