2016-11-16 16 views
1

アーティストIDとそのすべての部分が検索されたときに、基本的にはArtistArtistPieceDjangoの外部キーが1対多の関係では機能しない

#models.py 
class Artist(models.Model): 
    name = models.CharField(max_length=100) 
    artist = models.CharField(max_length=150) 
    created_by = models.ForeignKey(User) 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 

class ArtistPiece(models.Model): 
    artist = models.ForeignKey(Artist, on_delete = models.CASCADE) 
    piece_name = models.CharField(max_length=50) 
    details = models.CharField(max_length=100) 
#views.py 
from .models import Artist, ArtistPiece 

class EditArtistViewSet(viewsets.ViewSet): 

    def edit(self,request,artist_id): 
     artist = Artist.objects.select_related().get(pk=artist_id) 
     data = model_to_dict(artist) 
     return render(
      request, 'ArtistInfo/edit.html', { 
       'editing': 'true', 
       'edit_data': json.dumps(data), 
      }) 

    def submit_edit(self,request): 
     return render(request, 'ArtistInfo/edit.html') 

上記の作品が、それは主キーにもかかわらず、ArtistPieceモデルからのデータのいずれかを選択しません。その後this postを読んだら、select_relatedを使って、私はアーティストを見上げるのではなく、foreign_keyでArtistPieceを探し、select_relatedを使ってアーティストに関する情報を見つけなければならないと気づきました。

私は、試してみました次のエラーget()になったこの

def edit(self, request, artist_id): 
    artist = ArtistPiece.objects.get() 
    data = model_to_dict(artist) 

は、複数のArtistPieceを返された - それは5を返して!検索すると、私はthis postが見つかりましたが、私は取得するよりもむしろフィルタを使用する必要があると述べています。私はそれを試してみました

def edit(self, request, artist_id): 
    artist = ArtistPiece.objects.select_related('artist').filter(artist=artist_id) 
    data = model_to_dict(artist) 

これは、次のエラー'QuerySet' object has no attribute '_meta'を与えました。私はこのエラーを探してみたところ、基本的にgetを使うことを示唆しているthisが見つかりました。

要約すると、私はただアーティストとその作品を選択したいと思いますが、どのようにして分かりません。

編集 - 私は、いくつかのことを試してみましたが、いくつかの進歩を遂げたが、それはまだちょうど私が自分のIDでアーティストを検索しますクエリを記述しようとして明確にすることが正しく

を働いていません結果はアーティストの情報とアーティストの作品になります。 artist_idまたはArtistPieceモデルに基づいてArtistモデルをクエリして取得できますが、Artistとそのアーティストに関連付けられたすべてのArtistPieceエントリの両方を返すクエリは1つではありません。

related_name='pieces'を私のモデルに追加すると、私はを試しましたが、それでも上記のno属性を与えました。エラーです。 data = model_to_dict(artist)data = [model_to_dict(a) for a in artist]に変更しましたが、データはアーティストだけで、ArtistPieceモデルのデータはありませんでした。

代わりに私が代わりのような ArtistPieceモデルを照会しようとした Artistモデルを照会する

artist = ArtistPiece.objects.select_related('artist').filter(artist=artist_id)が、その後、唯一のアーティストの作品は、返却されたとArtistモデルからの情報なし。

+0

を行うことができ、リストが必要な場合、私は単数形であることをArtistPiece' 'の名前を変更しました。その名前は、各インスタンスがそれらの* 1 *を表すという事実を反映する必要があります。 – bignose

答えて

0

model_to_dictは単一のモデルオブジェクトを受け入れますが、これはQuerySetタイプのオブジェクト(これはリストに非常に似ています)に渡しています。Queryset.Values() documentを1として

data = artist.values() 

:より良い方法としてQuerySet.values()を使用することです

data = [model_to_dict(a) for a in artist] 

dictsすべてのオブジェクトのリストを取得するには、あなたは次のように明示的に各モデルオブジェクトに model_to_dictを呼び出す必要があります

イテラブルとして使用すると、モデルインスタンスではなく辞書を返すクエリセットを返します。

これらの各辞書は、モデルオブジェクトの属性名に対応するキーを持つオブジェクトを表します。

さらに、Serializerクラスをご覧ください。私はそれがあなたにとって役に立つと思う。

+0

それは部分的に動作します。私は 'Artist'モデルか' ArtistPiece'モデルのどちらかを照会することができますが、私は外部キーを使って "結合"クエリを得ることはできません。私は変更を示すために私のポストを編集しました。ありがとう – user1852176

0

ForeignKeyフィールドタイプは、自動的に外部モデルの属性も設定します。あなたの場合はArtist.artistpieces_setです。

favourite_artist = Artist.objects.get(pk="foo") # However you get an Artist instance. 
favourite_artist.artistpieces_set # Is a QuerySet of all the ArtistPiece instances that reference this instance. 

# Because it's a QuerySet, you can iterate it, filter it, etc. 
for piece in favourite_artist.artistpieces_set.all(): 
    put_in_exhibition(piece) 

あなたがArtistインスタンスを取得するときにこのように、それは自動的にそのArtistを参照ArtistPieceインスタンスのQueryManagerある属性を持っています。

これは、外部キーの関係が1つの場所で定義されていることを意味しますが、もう一方の端からもアクセス可能であるためです。

これらの機能の使用方法については、「Following relationships “backwards”」のマニュアルを参照してください。

+0

私はこの 'favourite_artist = Artist.objects.get(pk =" foo ")'を試してもアーティストは返されますが、 'favourite_artist.pieces'は' 'QuerySet 'オブジェクトに属性' pieces 'がないことを示すエラーをスローします。私は間違いなく私のモデルでrelated_nameとして作品を持っています。 – user1852176

+0

このメッセージは、ArtistインスタンスではなくQuerySetインスタンスがあることを示しています。オブジェクトの取得方法を再確認してください。 – bignose

+0

私はいくつかの変更を加えていくつかの進歩を遂げましたが、まだ動作していません。モデルから 'related_name = 'pieces'を削除し、' favourite_artist.pieces'を特異なものにしたので、 'favourite_artist.piece'になりました。これは、[Django documentation](https://docs.djangoproject .com/en/1.10/ref/models/relations /)が表示されています。しかし、私は今、 '' RelatedManager 'オブジェクトが反復可能でないというエラーを受け取りました。 – user1852176

0

ArtistPiece.objects.filter(artist=artist_id)これはクエリセットを返します。
あなたはArtistPiece.objects.filter(artist=artist_id).values_list('id', flat=True)
https://docs.djangoproject.com/en/1.10/ref/models/querysets/#values-list

+0

これはあなたが望んでいないかどうか教えてください – drigger

+0

最初のクエリが機能しますが、artist_idの 'ArtistPiece'エントリのみが返され、' Artist'と 'ArtistPiece'の両方は返されません。 2番目のものは、次のエラーを返します。 '' int 'オブジェクトには属性' _meta 'がありません。 – user1852176

関連する問題