2017-03-26 14 views
0

Django Rest Frameworkで逆の関係を表示できませんでした。ここでは私の場合、家賃は複数の画像を持つことができ、私はその家賃(居間画像、キッチン画像、バスルーム画像など)のすべての画像を/ api/v1/rentに表示したいと思っています。親クラスに外部キーを表示

レンタルリソースに表示するこれらのギャラリーを取得するにはどうすればよいですか?

class Rental(models.Model): 
    user = models.ForeignKey(User) 
    name = models.CharField(max_length=300, blank=False, null=False) 
    phone_number = models.PositiveIntegerField(null=False, blank=False) 
    renter = models.CharField(choices=RENTER_CHOICES, max_length=1, default=RENTER_CHOICES[0]) 

    def __str__(self): 
     return self.name 

def user_directory_path(instance, filename): 
    return 'rent_{0}/{1}'.format(instance.rent.id, filename) 

class Gallery(models.Model): 
    rent = models.ForeignKey(Rental, related_name="rent") 
    image = models.FileField(upload_to=user_directory_path) 
    tag = models.CharField(max_length=1, choices=TAGS, null=True, blank=True) 

class GallerySerializer(serializers.ModelSerializer): 
    rent = serializers.ReadOnlyField() 
    class Meta: 
     model = Gallery 
     fields = ('rent', 'image', 'tag',) 

class RentalSerializer(serializers.ModelSerializer): 
    user = serializers.ReadOnlyField(source='user.username') 
    # gallery = serializers.SerializerMethodField('get_children') 
    # 
    # def get_children(self, obj): 
    #  print ('obj', obj.gallery_set) 
    #  serializer = GallerySerializer(obj.gallery_set.all(), many=True) 
    #  return serializer.data 
    gallery = GallerySerializer(source='gallery_set',many=True, read_only=True) 
    class Meta: 
     model = Rental 
     fields = ('user', 'name', 'phone_number','gallery',) 

は今、私は両方の方法で、1つのコメント方法と別のソース=「gallery_set」の方法を使用して、ギャラリーのリストを取得いけません。私はrent = GallerySerializer(many=True)をすれば

UPDATE

私はギャラリーの一覧を取得するが、それはどんな意味を成していますか?

[ 
    { 
     "user": "admin", 
     "name": "Sunrise Home", 
     "phone_number": 9842333833, 
     "rent": [ 
      { 
       "image": "http://localhost:8000/media/rent_1/sittingRoom.jpg", 
       "tag": "L" 
      } 
     ] 
    } 
] 

上記のapiではギャラリーが表示されていますが、レンタルリソース内の賃貸物件のリストとして表示されています。誰も私がより良い方法でAPIを設計するのを助けることができますか?あなたが指定したrelated_nameが自動的Rentalオブジェクトのフィールドを定義して、あなたのGalleryモデルでRentalのための外部キー関係を指定

答えて

1

。そのフィールドの名前はrelated_nameに設定します。この場合はrentです。

ここで理解しておくべき重要なことは、related_nameが、モデルでキーが宣言されている場所とは反対側にアタッチされることです。関連する名前はRentalオブジェクトのプロパティになるため、その例ではより適切な名前がgalleriesになる可能性があります。 related_nameが定義されている同じ名前のGallerySerializerを宣言することにより

class RentalSerializer(serializers.ModelSerializer): 
    user = serializers.ReadOnlyField(source='user.username') 
    galleries = GallerySerializer(many=True, read_only=True) 
    class Meta: 
     model = Rental 
     fields = ('user', 'name', 'phone_number','galleries')  

あなたはgalleriesrentalからあなたのモデルでrelated_nameを変更すると仮定すると、あなたは出力に関連したギャラリーのリストをごRentalシリアライザを定義することができますあなたの外来のキーの関係では、それはレンダリングに関連付けられているギャラリーのみが自動的に検索されます。別の例では

のは、あなたがバスケットにいくつかの卵を持っているとしましょう。私たちは、卵とバスケットの間に多対1の関係を作り、両者の間に外来的な関係を作り、これを達成したいと考えています。これは、Eggごとに関連付けられたIDのBasketを格納する形式になります。

Djangoでは、Eggモデルで外部キーを宣言します。これにより、卵が入っているバスケットにegg.basketでアクセスできます。我々はまた、特定のバスケット内にある卵が何であるかを知りたい。外部キーフィールドにrelated_nameを定義することでそれを行います。これは、Djangoに、そのバスケットを含む全ての卵にフィールドを呼び出さなければならないことをDjangoに伝えます。このフィールドはバスケット内のすべての卵を指しているので、eggsとします。コードで

class Basket(models.Model): 
    color = models.CharField() 

class Egg(models.Model): 
    color = models.CharField() 
    basket = models.ForeignKey(Basket, related_name="eggs") 
+0

私はrelated_nameの概念を理解するのに困難を抱えていました。 related_nameにはどのような名前を付ける必要がありますか?説明をありがとう。私はすでにそれをしましたが、あなたは私を非常に明確にしました。貴重な情報を共有してくれてありがとうございました。 – pythonBeginner

+0

@pythonLover私は自分の答えを更新して、 'related_name'をどのように指定するかの別の例を挙げました。回答があなたの問題を解決した場合、あなたはそれを受け入れて、あなたの質問が答えられたことを他人に知らせることができます。それが役に立てば幸い! – natbob1

+0

今私はrelated_nameにはっきりとしていますが、上記のような家賃のギャラリーのリストを表示するのではなく、ギャラリーで家賃のリストを表示したいのですが?家賃のギャラリーのリストとギャラリーの家賃のリストを表示することの違いを示す理論だけです。 – pythonBeginner

関連する問題