Проблема CONTENTTYPE - Человек - это идиот - не может понять, как привязать оригинальную модель на контент-теп абстрагированной «любимой» модели

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

  •  27-09-2019
  •  | 
  •  

Вопрос

Первоначально начался здесь: Django в запросе как строковый результат - неверный литерал для INT () с базой 10

У меня есть ряд приложений на моем сайте, в настоящее время работаю с простой приложением «блог». Я разработал «любимое» приложение, достаточно легко, которое использует Framework ContentType в Django, чтобы позволить мне иметь «любимый» любого типа ... пытаясь пойти другим путем, однако я не знаю, что я делаю, и не могу найти никаких примеров.

Я начну с любимой моделью:

Любимые / модели

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

Теперь, это позволяет мне питаться через фаворитов (например, на странице «Избранное» пользователя) и получите связанные объекты блога через {{forever.content_object.title}}.

То, что я хочу сейчас, и не могу выяснить, это то, что мне нужно сделать с моделью блога, чтобы позволить мне иметь несколько привязки к фаворите (поэтому, когда он отображается в списке, его можно выделить, например).

Вот модель блога:

Блог / Модели

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"

Любое руководство?

Это было полезно?

Решение

Django DOC на нем здесь: Обратное общие отношения. Отказ В основном на самой модели блога вы можете добавить GenericRelation...

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

Для данного блога вы можете найти все Favorite Модели, которые связаны с этим ...

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

Или посмотрите, есть ли текущий пользователь в своем блоге ...

user_has_blog_favorited = b.favorites.objects.filter(user=request.user).exists()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top