2017-06-24 9 views
2

Djangoのドキュメントではこれを明白に述べておらず、迷惑になります。djangoで2つのモデルが外部キーで接続されている場合、結合を行う必要がありますか?

は、次のモデルを守ってください。

# models 
class Venue(models.Model): 
    name = models.CharField(max_length=150, blank=False) 
    description = models.CharField(max_length=1000) 
    image = models.ImageField(upload_to=imgUnique('venueMedia/venueImages')) 
    streetAddress= models.CharField(max_length=100) 
    city = models.CharField(max_length=100, blank=False) 
    state = models.CharField(max_length=100, blank=False) 


class Room(models.Model): 
    name = models.CharField(max_length=150, blank=False) 
    venue = models.ForeignKey(Venue, related_name='rooms', on_delete=models.CASCADE) 
    description = models.CharField(max_length=1000) 
    standingCapacity = models.IntegerField 
    seatedCapacity = models.IntegerField 
    image = models.ImageField(upload_to=imgUnique('venueMedia/venueImages')) 

私は部屋venue財産でRoomモデルでVenueへの外部キー関係を持っています。

これらのテーブルに参加する必要はありますか?または、Venue.objects.all()は自動的に私のためにそれを行いますか?

Venue.objects.all().select_related('Room') 

ことができます:その後、私はそこselect_related()方法であり、私の理解は、私は次の操作を行うだろうということです理解していない場合

venueList = Venue.objects.raw('''SELECT * 
           FROM venue_Venue 
           INNER JOIN venue_Room 
           ON venue_Venue_id=venue_Room_id''') 

:いない場合は、私は次のように生のSQLを持っています。この作品私たちはこれを明確にしますか?あなたが見ることができるように私は研究をたくさん行って、まだ

+0

を使用してください。venuel.objects.all()にはroomオブジェクトが含まれます.u未処理のクエリやいくつかのものを書く必要はありません。たとえば、 'venue = Venue.objects。もしあなたが部屋の名前を取得したい場合は、 'venue.room.name'を使うことができます。これは私に知らせてくればうまくいきます。 –

+0

ありがとうございました。これは良いです。 –

答えて

4

混乱していているあなたはのForeignKeyまたはOneToOneフィールドで接続されたオブジェクトを選択したい場合は、より正確にあなたがこれだけを使用することができます使用することができますselect_related

をselect_related 1つの接続オブジェクトを選択したいときに使用します。 select_relatedはそれを使用してrelated_fieldを検索することができます。モデル属性に指定されているパラメータrelated_name='rooms'は、関連する名前の設定を担当します。 select_relatedメソッドはこれらの関連する名前を検索し、一致するものが見つかると関連するオブジェクトを返します。あなたが任意の関連する名前「ルーム」を持っていませんが、あなたはroomを持っているので、あなたはまた、大文字と小文字の区別に注意する必要があるとして、このライン

Venue.objects.all().select_related('Room') 

は、ルックアップエラーになります。下の方がうまくいくでしょう。

Venue.objects.all().select_related('room') 

上記のように、select_relatedは、関連する単一のオブジェクトを選択するためにのみ使用できます。 ManyToManyFieldのような複数の関連オブジェクトを取得する場合は、prefetch_related

+0

しかし、私は使用する必要はありません関連するものを選択します。 @Abiは上で述べたように、venue.objects.all()はルームオブジェクトをつかむ。会場に接続された別のモデルを持っているかどうかを教えてください。私はその後、select関連を使用します。私はこのケースで選択した関連を使用することができますが、私は1つの接続されたテーブルしか持っていないので、その不要な権利はありますか? –

+0

ええ、ここでrelated_fieldを使用する必要はありませんが、私はrelated_fieldsについて説明しようとしました。彼らはあなたが言及したような他のケースで使用することができます。 –

+1

nifty。よく抱擁とキスありがとう男 –

関連する問題