ContentType Edición - Humano es un idiota - No se puede encontrar la manera de atar el modelo original a un modelo ContentType abstraído 'Favorito'

StackOverflow https://stackoverflow.com/questions/2656637

  •  27-09-2019
  •  | 
  •  

Pregunta

Originalmente comenzó aquí: Django en la consulta como resultado de cadena - literal válido para int () con la base 10

Tengo un número de aplicaciones dentro de mi sitio, que actualmente trabaja con una sencilla aplicación "Blog". He desarrollado una aplicación 'Favorito', con bastante facilidad, que aprovecha el marco ContentType en Django para permitir que tuviera una 'favorito' de cualquier tipo ... tratando de ir a otro lado, sin embargo, no sé lo que estoy haciendo, y no puedo encontrar ningún ejemplo para.

Voy a empezar con el modelo favorita:

favorito / models.py

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
from django.contrib.auth.models import User

class Favorite(models.Model):
        content_type    = models.ForeignKey(ContentType)
        object_id       = models.PositiveIntegerField()
        user            = models.ForeignKey(User)
        content_object  = generic.GenericForeignKey()

        class Admin:
                list_display = ('key', 'id', 'user')

        class Meta:
                unique_together = ("content_type", "object_id", "user")

Ahora, lo que me permite colocar a través de los favoritos (en la página de "favoritos" de un usuario, por ejemplo) y obtener los objetos asociados a través del blog {{}} favorite.content_object.title.

Lo que quiero ahora, y no puede entender, es lo que tengo que hacer para el modelo blog para permitir que tuviera alguna sujeción al favorito (por lo que cuando se muestra en una lista se puede destacar, por ejemplo).

Aquí está el modelo de blog:

Blog / models.py

from django.db import models
from django.db.models import permalink
from django.template.defaultfilters import slugify
from category.models import Category
from section.models import Section
from favorite.models import Favorite
from django.contrib.auth.models import User
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Blog(models.Model):
        title           = models.CharField(max_length=200, unique=True)
        slug            = models.SlugField(max_length=140, editable=False)
        author          = models.ForeignKey(User)
        homepage        = models.URLField()
        feed            = models.URLField()
        description     = models.TextField()
        page_views      = models.IntegerField(null=True, blank=True, default=0 )
        created_on      = models.DateTimeField(auto_now_add = True)
        updated_on      = models.DateTimeField(auto_now = True)

        def __unicode__(self):
                return self.title

        @models.permalink
        def get_absolute_url(self):
                return ('blog.views.show', [str(self.slug)])

        def save(self, *args, **kwargs):
                if not self.slug:
                        slug = slugify(self.title)
                        duplicate_count = Blog.objects.filter(slug__startswith = slug).count()
                        if duplicate_count:
                                slug = slug + str(duplicate_count)
                        self.slug = slug
                super(Blog, self).save(*args, **kwargs)

class Entry(models.Model):
        blog            = models.ForeignKey('Blog')
        title           = models.CharField(max_length=200)
        slug            = models.SlugField(max_length=140, editable=False)
        description     = models.TextField()
        url             = models.URLField(unique=True)
        image           = models.URLField(blank=True, null=True)
        created_on      = models.DateTimeField(auto_now_add = True)

        def __unicode__(self):
                return self.title

        def save(self, *args, **kwargs):
                if not self.slug:
                        slug = slugify(self.title)
                        duplicate_count = Entry.objects.filter(slug__startswith = slug).count()
                        if duplicate_count:
                                slug = slug + str(duplicate_count)
                        self.slug = slug
                super(Entry, self).save(*args, **kwargs)

        class Meta:
                verbose_name = "Entry"
                verbose_name_plural = "Entries"

Cualquier orientación?

¿Fue útil?

Solución

El doc Django en él está aquí: las relaciones genéricas inversa . Básicamente en el propio modelo de Blog se puede añadir un GenericRelation ...

class Blog(models.Model):
    favorites = generic.GenericRelation(Favorite)

Para un determinado blog se pueden encontrar todos los modelos Favorite que se asocian con él ...

b = Blog.objects.get(slug='hello-world-blog-slug')
all_blog_favorites = b.favorites.objects.all()

O ver si el usuario actual tiene el blog Favorited ...

user_has_blog_favorited = b.favorites.objects.filter(user=request.user).exists()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top