2013-03-20 75 views
1

我是Django开发新手,刚刚开始编写应用程序。 我在models.py定义两类:Django反向ForeignKey查找返回无

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

一个问题:我应该使用OneToOne? – 2013-03-20 11:09:57

+0

是的,如果一个'neo'对象只与一个'coords'对象有关系。 – Amyth 2013-03-20 11:25:13

+0

'n.coords_set.all' – catherine 2013-03-20 11:49:03

回答

4

这里的ForeignKey是一个ManyToOne关系(as suggested in the docs),所以在你的情况下多个Coords对象可以绑定到一个NEO对象。如果您想要OneToOne关系,您可能需要使用models.OneToOneFielddocumentation 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 
0

它没有意义的,有两个表引用对方的双外键,因为你碰上鸡还是先有蛋的问题。您需要决定是否可以存在一对多关系或一对一关系。

可以NEO有多个CoordsCoord可以有多个NEOs?如果答案是肯定的,那么你需要一个ForeignKeyForeignKey应该在关系的许多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

+0

尝试n.coords返回“AttributeError:'NEO'对象没有属性'coords'”。 – 2013-03-20 12:15:46