查询数据库表

时间:2010-10-16 17:54:07

标签: django

我有以下Django表格(我删除了非必要字段):

class Person(models.Model):
    nameidx = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=300, verbose_name="Name")     
class Owner(models.Model):
    id = models.IntegerField(primary_key=True) 
    nameidx = models.IntegerField(null=True, blank=True) # is Person.nameidx
    structidx = models.IntegerField() # is PlaceRef.structidx
class PlaceRef(models.Model):
    id = models.IntegerField(primary_key=True) 
    structidx = models.IntegerField() # used for many things and not equivalent to placeidx
    placeidx = models.IntegerField(null=True, blank=True) # is Place.placeidx
class Place(models.Model):
    placeidx = models.IntegerField(primary_key=True) 
    county = models.CharField(max_length=36, null=True, blank=True)
    name = models.CharField(max_length=300)

我的问题如下。如果在我的views.py文件中,我有一个名称引用的人,我想找出他们作为QuerySet拥有的所有地方,我该怎么办?

我可以做到这一点:

person = Person.objects.get(name=name)
owned_relations = Owner.objects.filter(nameidx=nameidx)

我如何从这里到达地方?我应该使用数据库方法吗?

我也不确定我是否应该使用ForeignKey Owner.nameidx。

对这个非常基本的问题表示感谢和道歉。我不知道如何学习数据库查询的基础知识除了尝试,失败,问SO,再试一次...... :)

2 个答案:

答案 0 :(得分:1)

外键的重点是像你这样的用途。如果您已经知道Owner.nameidx引用了Person,为什么不将它作为Person表的外键(或OneToOne字段)?您不仅可以获得引用完整性的优势 - 它使得无法为nameidx输入不是有效人员的值 - Django ORM将使您能够轻松地“关注”关系:< / p>

owned_places = Place.objects.filter(placeref__owner__person=my_person)

将为您提供my_person所拥有的所有地点。

顺便说一下,你不需要定义单独的主键字段--Django会为你做这些,并使它们成为自动增量字段,这几乎总是你想要的。

答案 1 :(得分:0)

如果你可以重新设计。那么

 In owner nameidx can be a foreign key to Person(nameidx)
 Placeref(structidx) could be a foreign key to Owner(structidx) and 
 Place(placeidx) could be a foreign key Place ref(placeidx)

然后你可以很容易地推断出地方价值。