2013-03-20 2 views
1

Я новичок в разработке Django и только что начал писать приложение. У меня есть два класса, определенные в models.py:Django reverse ForeignKey lookup возвращает None

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? –

+0

Да, если один объект 'neo' может иметь отношение только к одному объекту' coords'. – Amyth

+0

'n.coords_set.all' – catherine

ответ

4

ForeignKey - это отношения ManyToOne (as suggested in the docs), поэтому в вашем случае несколько объектов Coords могут быть привязаны к одному объекту NEO. Если вы хотите OneToOne Relation, вы можете использовать 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 
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

+0

Trying n.coords возвращает« AttributeError: объект «NEO» не имеет атрибутов «coords». –

Смежные вопросы