Django反向查找ForeignKey返回None



我是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对象?

ForeignKey这里是一个ManyToOne关系(如文档中建议的),所以在您的情况下,多个Coords对象可以绑定到单个NEO对象。如果你想要一个OneToOne关系,你可以使用models.OneToOneField(文档在这里)。

在查找外键的情况下,可以使用。

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

让两个表使用双外键相互引用是没有意义的,因为您会遇到鸡还是蛋的问题。您需要决定是否可以存在一对多关系或一对一关系。

一个NEO可以有多个Coords吗?一个Coord可以有多个NEOs吗?如果答案是肯定的,那么你需要一个ForeignKeyForeignKey应该位于关系的one-to-many一侧。如果答案是否定的,并且只能有一个一对一的链接,那么您需要一个OneToOneField

访问关系的反面很简单:

# 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

最新更新