我有以下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,再试一次...... :)
答案 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)
然后你可以很容易地推断出地方价值。