假设您有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”选项有错误)
答案 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()