2011-02-10 10 views
7

Intentando verificar y ver si existe un artista, si no agrega o enlaza con foreignkey y guarda.Django foreignkey get_or_create

Estos son los modelos

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) 

Aquí está la secuencia de comandos que comprueba

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

¿Qué estoy haciendo mal?

+0

¿Qué error obtienes? – Glycerine

+1

literal no válido para int() con base 10: – tim

+0

genial, pero ¿tiene el rastro completo? ¿Número de línea y tal? Acabo de intentar ejecutar el código y obtengo un error para la primera línea del script que comprueba. ¿Qué es '..._ or_create (artist_id = '...')' ?. La pista no tiene un campo llamado 'artist_id' – Glycerine

Respuesta

12

Para este ejemplo, acceder al get_or_create no funcionará al hacer referencia a una clave externa. Este ejemplo hace que funcione:

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. 

Si usted está tratando de recoger una pista a través de la identificación del artista. Para solucionar este - 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) 

Sé que esto probablemente no es lo que busca - Pero si me dicen el flujo de trabajo que desea solicitar, me pueden enviar el código sea más aplicable.

Cuestiones relacionadas