我是Django开发的新手,刚刚开始编写应用程序。 我在models.py中定义了两个类:
from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User
class NEO(models.Model):
name = models.CharField(max_length=100, default=' ')
sighter = models.ForeignKey(User, blank=True, null=True)
date_sighted = models.DateTimeField(default=timezone.now())
ratings = models.IntegerField(default=0)
#coords = models.ForeignKey('Coords', default='')
def __unicode__(self):
return self.name
class Coords(models.Model):
ra = models.FloatField('Right Ascension', default=0)
dec = models.FloatField('Declination', default=0)
neo = models.ForeignKey(NEO, related_name='neo_coords', null=True)
def __unicode__(self):
return str(self.ra) + ' ' + str(self.dec)
每个Coords
对象都链接到一个NEO
,反之亦然。
取消注释Neo.Coords
行,然后调用n.Coords
会返回None
。给定NEO
对象,如何获取相应的Coords
对象?
答案 0 :(得分:4)
ForeignKey这里是ManyToOne关系(as suggested in the docs),因此在您的情况下,可以将多个Coords
对象绑定到单个NEO
对象。如果您想要OneToOne关系,可以使用models.OneToOneField
(documentation here)。
如果是外键查找,您可以使用。
NEO.coords_set.get(**lookup_arguments_here)
# Here NEO.coords_set is the list of coords objects bound to this particular NEO object.
如果是OneToOne
,您只需使用
NEO.coords
答案 1 :(得分:0)
使用双外键让两个表互相引用是没有意义的,因为你遇到了鸡或鸡蛋问题。您需要决定是否存在一对多关系或一对一关系。
NEO
可以有多个Coords
吗? Coord
可以有多个NEOs
吗?如果答案是肯定的,那么您需要ForeignKey
。 ForeignKey
应位于关系one-to-many
的许多方面。如果答案是否定的,并且只能有一对一的链接,那么您需要OneToOneField
。
要访问reverse side of the relationship,这很简单:
# multiple coords per neo
class NEO(models.Model):
name = ...
class Coords(models.Model):
name = ...
neo = models.ForeignKey(NEO)
c = Coords.objects.get(id=1)
c.neo # shows the neo
n = NEO.objects.get(id=1)
coords = n.coords_set.all() # multiple coords per neo
如果你有一对一的关系:
class NEO(models.Model):
name = ...
class Coords(models.Model):
name = ...
neo = models.OneToOneField(NEO)
c = Coords.objects.get(id=1)
c.neo # shows the neo
n = NEO.objects.get(id=1)
coords = n.coords # only one possible coord per neo
https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships