基于相似标记集的Django“相似对象”

时间:2016-04-30 07:36:15

标签: jquery python django postgresql

假设您有1k个对象,每个对象都有10-50个标签。

对于任何给定的对象,必须有一个对象列表,这些对象具有从大多数到最少的共同关键字。

然而在Django参数中,我知道无法以这种方式进行查询。

django中是否存在这样的事情,还是应该在django的约束之外编写算法?

class Product(models.Model):

    product_id = models.IntegerField(
        unique=True,
    )

    slug = models.SlugField(
        unique=True,
        blank = True,
        null = True,   
    )

    meta_description = models.TextField(
        max_length = 160,
        blank = True,
        null = True,    
    )


    title = models.CharField(
        max_length = 160,
        blank = True,
        null = True,
    )


    description = models.TextField(
        blank = True,
        null = True,    
    )

    first_subject_heading = models.CharField(
        max_length = 160,
        blank = True,
        null = True,
    )

    description_main = models.TextField(
        blank = True,
        null = True,    
    )

    price = models.DecimalField(
        max_digits=6, 
        decimal_places=2,
        blank = True,
        null = True,        
    )

    published = models.DateTimeField(auto_now_add=True, blank=True)

    tags = TaggableManager(
        blank = True,
    )

    category = models.ManyToManyField(
        'ProductCategory',
        blank = True,
    )

    license_selection_model = models.IntegerField(
        default = 1,
        blank = True,
        null = True, 
    )

    minipic = models.ImageField(
        upload_to='minipics/',
        blank = True,
        null = True, 
    )

    def get_absolute_url(self):
        from django.core.urlresolvers import reverse
        return reverse('store.views.product', args=[self.slug])

    def save(self, *args, **kwargs):
        if not self.id and not self.slug:
            #Only set the slug when the object is created.
            self.slug = slugify(self.title) #Or whatever you want the slug to use
        super(Product, self).save(*args, **kwargs)

    def __str__(self):
        return "%i, %s"%(self.product_id, self.title)

这是使用postgres和taggit扩展(taggit的“similars”选项有错误)

1 个答案:

答案 0 :(得分:1)

Django Taggit提供了TaggableManager来帮助他们使用他们的API。 它提供了一个similar_objects()方法,它以相似的降序返回与特定对象类似地标记的对象列表。

来自docs:

  

similar_objects()
  返回其他的list(不是懒惰的QuerySet)   对象标记与此类似的对象,以最相似的顺序排序。   列表中的每个对象都使用similar_tags属性进行修饰,   它与此对象共享的标签数量。

# returns list of objects tagged similarly
some_object.tags.similar_objects()