2011-02-10 16 views
7

Bir sanatçı olup olmadığını kontrol edip görmeye çalışın, yabancı kanala ekleme yapmayın veya bağlantı oluşturmayın ve kaydedin.Django foreignkey get_or_create

İşte modelleri İşte

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) 

yanlış yapıyorum

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() 

denetler komut edilir mi?

+0

Hangi hatayı alıyorsunuz? – Glycerine

+1

int() ile temel 10: – tim

+0

için geçersiz bir hazır değer - ancak tam iziniz var mı? Hat numarası ve benzeri? Sadece kodu çalıştırmayı denedim ve kontrol eden komut dosyasının ilk satırı için hata alıyorum. '..._ or_create (artist_id = '...')'? Track'in "artist_id" – Glycerine

cevap

12

Bu örnekte, yabancı bir anahtar başvurulurken get_or_create dosyasına erişilemez. Bu örnek çalışması yapar:

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. 

Eğer sanatçının kimliği üzerinden bir parçayı toplamaya çalışıyorsanız. Bu sorunu gidermek için - do:

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) 

Bunun aradığın şeyi muhtemelen değil biliyorum - Ama bana uygulamak istediğiniz iş akışını söylersen, ben daha uygulanabilir bir kod gönderebilir.

İlgili konular