ltmo:/El huevo, la gallina y los herederos de la vívora.

El huevo, la gallina y los herederos de la vívora.

Estoy haciendo un sitio que es como un portafolio para artistas...

Los "artistas" tienen (permitanme ponerme mis anteojos de pasta): Pictures o Videos y los organizan en Albums:

class Album(models.Model):
    name = models.CharField(max_length=60)
    description = models.TextField(null=True, blank=True)
    created = models.DateTimeField(auto_now_add=True, editable=False)


class Video(Content):
    source = models.URLField()
    thumbnail = models.URLField(editable=False)
    caption = models.CharField(max_length=128, null=True, blank=True)
    album = models.ForeignKey('Album')
    created = models.DateTimeField(auto_now_add=True, editable=False)


class Picture(Content):
    source = models.ImageField(upload_to='pictures')
    thumbnail = models.URLField(editable=False)
    caption = models.CharField(max_length=128, null=True, blank=True)
    album = models.ForeignKey('Album')
    created = models.DateTimeField(auto_now_add=True, editable=False)

Acá cualquier ingeniero de medio pelo dice: "No Te Repitas!, tenés la mitad de campos iguales en Video y Picture!". i

Así que, hacemos un modelo abstracto y cortamos un poco de código:

class Content(models.Model):
    caption = models.CharField(max_length=128, null=True, blank=True)
    album = models.ForeignKey('Album')
    created = models.DateTimeField(auto_now_add=True, editable=False)

    class Meta:
        abstract = True

class Video(Content):
    source = models.URLField()
    thumbnail = models.URLField(editable=False)
    code = models.TextField(editable=False)

class Picture(Content):
    thumbnail = models.ImageField(upload_to='pictures')

Ahora... nos gustaría que nuestro Album, saque su portada de los contenidos que tiene relacionados.

class Album:
    ...
    def cover(self):
        return self.content_set.all()[0]

ERROR. No hay tal cosa como Album.content_set ya que Content es abstracta. Voy a tener una relación por cada una de las derivadas (picture_set y video_set, respectivamente), pero no una para ambas.

Probemos al revez:

class Content(models.Model):
    caption = models.CharField(max_length=128, null=True, blank=True)
    album = models.ForeignKey('Album')
    created = models.DateTimeField(auto_now_add=True, editable=False)

class Video(Content):
    source = models.URLField()
    thumbnail = models.URLField(editable=False)
    code = models.TextField(editable=False)

class Picture(Content):
    thumbnail = models.ImageField(upload_to='pictures')

Acá me doy cuenta que la solución es una cagada y lo que tengo que hacer es normalizar a lo viejo y peludo.

class Content(models.Model):
    source = models.URLField(null=True, blank=True)
    image = models.ImageField(upload_to='pictures', null=True, blank=True)
    caption = models.CharField(max_length=128, null=True, blank=True)
    album = models.ForeignKey('Album')
    created = models.DateTimeField(auto_now_add=True, editable=False)
    thumbnail = models.URLField(editable=False)
    code = models.TextField(editable=False)

Y a la chota.

a e frase gif i imagen r video

El huevo, la gallina y los herederos de la vívora. , Julio 6, 2014, testo,