2011-02-10 6 views
7

アーティストが存在するかどうかチェックしてみてください。そうでない場合は、外部キーを追加またはリンクして保存してください。ここでDjango foreignkey get_or_create

はここでモデル

class Artist(models.Model): 
    """Artist model""" 
    title = models.CharField(max_length=250, unique=True) 
    slug = models.SlugField(unique=True) 


class Track(models.Model): 
    """Track model""" 
    artist = models.ForeignKey(Artist) 
    title = models.CharField(max_length=250) 
    slug = models.SlugField(unique=True) 

ある

artist_id, created = Track.objects.get_or_create(artist_id=artist.title) 
try: 
    artist_title = artist_id.artist_set.all() 
except IndexError: 
    artist_slug = slugify(artist_title) 
    try: 
     artist = Artist.objects.create(title=artist_title, slug=artist_slug) 
     # artist.add(artist_id) 
     artist.save() 

私が間違って何をやっているをチェックするスクリプトですか?

+0

どのようなエラーが表示されますか? – Glycerine

+1

ベース10のint()のリテラルが無効です: – tim

+0

クールですが、完全なトレースがありますか?行番号など?私はちょうどコードを実行しようとしたと私はチェックスクリプトの最初の行のエラーを取得します。 '..._ or_create(artist_id = '...')'とは何ですか?トラックには「artist_id」というフィールドがありません – Glycerine

答えて

12

この例では、外部キーを参照するときにget_or_createへのアクセスは機能しません。 この例では、それが動作します:

a = Artist.objects.create(title='Sinch', slug='sinch') 
t = Track.objects.create(artist=a, title='bitmap', slug='bitmap') 
Track.objects.get_or_create(artist__id=1) 
(<Track: Track object>, False) #is returned. 

あなたはアーティストのIDを経由してトラックを収集しようとしている場合。これを回避するには - の操作を行います。

try: 
    a = Artist.objects.get(id=2) 
except DoesNotExist: 
    artist_title = 'title' 
    artist_slug = slugify(artist_title) 
    artist = Artist.objects.create(title=artist_title, slug=artist_slug) 
    artist.save() 

t, c = Track.objects.get_or_create(artist=a) 

私は、あなたが探して何これはおそらくではありません知っている - しかし、あなたは私にあなたが適用したいワークフローを言うならば、私はより多くの該当コードを投稿することができます。

関連する問題