مشكلة contentType - الإنسان هو أحمق - لا يمكن معرفة كيفية ربط النموذج الأصلي بنموذج "المفضل" المحتوى المستخلص

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

  •  27-09-2019
  •  | 
  •  

سؤال

بدأت في الأصل هنا: django في الاستعلام كنتيجة لسلسلة - حرفي غير صالح لـ int () مع قاعدة 10

لديّ عدد من التطبيقات داخل موقعي ، وأعمل حاليًا مع تطبيق "مدونة" بسيط. لقد طورت تطبيقًا "مفضلًا" ، بسهولة كافية ، يعزز إطار 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")

الآن ، يتيح لي ذلك حلقة من خلال صفحة "المفضلة" للمستخدم ، على سبيل المثال) والحصول على كائنات المدونة المرتبطة بها عبر {{المفضل. content_object.title}}.

ما أريده الآن ، ولا يمكنني معرفة ذلك ، هو ما أحتاج إلى القيام به لنموذج المدونة للسماح لي أن يكون لدي بعض الحبل إلى المفضل (لذلك عندما يتم عرضه في قائمة يمكن تسليط الضوء عليه ، على سبيل المثال).

هنا نموذج المدونة:

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"

أي توجيه؟

هل كانت مفيدة؟

المحلول

مستند Django عليه هنا: عكس العلاقات العامة. أساسا على نموذج المدونة نفسه يمكنك إضافة ملف 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