2

私は Django 開発に不慣れで、アプリを書き始めたばかりです。models.py で定義された 2 つのクラスがあります。

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.CoordsNone. オブジェクトが与えられたNEO場合、対応するオブジェクトを取得するにはどうすればよいCoordsですか?

4

2 に答える 2

4

ここでの ForeignKey は ManyToOne の関係です(docs で提案されているように)。したがって、あなたの場合、複数の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
于 2013-03-20T11:16:06.227 に答える
1

ニワトリが先かタマゴが先かという問題が発生するため、2 つのテーブルが二重の外部キーを使用して相互に参照することは意味がありません。1 対多の関係または 1 対 1 の関係が存在できるかどうかを判断する必要があります。

NEO複数持つことはできCoordsますか?Coord複数持つことはできNEOsますか?答えが「はい」の場合、ForeignKey. 関係のForeignKey多くのone-to-many側にある必要があります。答えが「いいえ」で、1 対 1 のリンクしか存在できない場合は、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

代わりに、1 対 1 の関係がある場合:

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

于 2013-03-20T11:54:43.087 に答える