Django manytomany 字段,如何检查 80% 的子集/匹配?
Django manytomany field, how to get check for 80% subset/ match?
我有一个包含烹饪食谱的 Django 数据库。我想查询所有至少有 80% 的成分来制作食谱的用户。我该如何实现?
或者我如何查询只缺少一种食谱成分的用户?
models.py
class ingredient(models.Model):
id = models.AutoField("id",max_length = 100, primary_key=True)
name=models.CharField("Ingredient", max_length=100)
def __unicode__ (self):
return self.name
class user(models.Model):
id = models.AutoField("id",max_length = 100, primary_key=True
ingredient = models.ManyToManyField(ingredient,blank=True)
def __unicode__ (self):
return str(self.id)
class recipe(models.Model):
id = models.AutoField("id", max_length=100, primary_key=True)
recipe_ingredient = models.ManyToManyField(ingredient,related_name='recipe_ingredient',blank=True)
def __unicode__ (self):
return self.id
我会用django-haystack,你可以为你的
job_opening
对所有成分进行建模和索引:
class JobOpeningIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
recipe_ingredient = indexes.MultiValueField()
def prepare_recipe_ingredient(self, obj):
return [i.name for i in obj.recipe_ingredient.all()]
def get_model(self):
return job_opening
def index_queryset(self, using=None):
return self.get_model().objects.all()
创建索引后,您可以按成分或成分列表进行过滤,haystack 将 return 所有符合搜索条件的对象,按相关性排序。然后,您可以将 80%
映射到相关性得分,并过滤掉相关性低于所需数量的项目。
SearchQuerySet().models(job_opening).filter(recipe_ingredient__in=['ingredient1', 'ingredient2', 'ingredient3'])
编辑
看完编辑后的问题,我们用job_opening
的地方基本上就得用recipe
了。而且您似乎想找到相关用户,而不是食谱。为此,您必须索引用户模型而不是原始的 job_opening
模型:
class UserIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
ingredient = indexes.MultiValueField()
def prepare_ingredient(self, obj):
return [i.name for i in obj.ingredient.all()]
def get_model(self):
return user
def index_queryset(self, using=None):
return self.get_model().objects.all()
创建索引后,您可以像这样进行筛选:
myrecipe = recipe.objects.get(...)
SearchQuerySet().models(user).filter(ingredient__in=myrecipe.recipe_ingredient.all())
我有一个包含烹饪食谱的 Django 数据库。我想查询所有至少有 80% 的成分来制作食谱的用户。我该如何实现?
或者我如何查询只缺少一种食谱成分的用户?
models.py
class ingredient(models.Model):
id = models.AutoField("id",max_length = 100, primary_key=True)
name=models.CharField("Ingredient", max_length=100)
def __unicode__ (self):
return self.name
class user(models.Model):
id = models.AutoField("id",max_length = 100, primary_key=True
ingredient = models.ManyToManyField(ingredient,blank=True)
def __unicode__ (self):
return str(self.id)
class recipe(models.Model):
id = models.AutoField("id", max_length=100, primary_key=True)
recipe_ingredient = models.ManyToManyField(ingredient,related_name='recipe_ingredient',blank=True)
def __unicode__ (self):
return self.id
我会用django-haystack,你可以为你的
job_opening
对所有成分进行建模和索引:
class JobOpeningIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
recipe_ingredient = indexes.MultiValueField()
def prepare_recipe_ingredient(self, obj):
return [i.name for i in obj.recipe_ingredient.all()]
def get_model(self):
return job_opening
def index_queryset(self, using=None):
return self.get_model().objects.all()
创建索引后,您可以按成分或成分列表进行过滤,haystack 将 return 所有符合搜索条件的对象,按相关性排序。然后,您可以将 80%
映射到相关性得分,并过滤掉相关性低于所需数量的项目。
SearchQuerySet().models(job_opening).filter(recipe_ingredient__in=['ingredient1', 'ingredient2', 'ingredient3'])
编辑
看完编辑后的问题,我们用job_opening
的地方基本上就得用recipe
了。而且您似乎想找到相关用户,而不是食谱。为此,您必须索引用户模型而不是原始的 job_opening
模型:
class UserIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
ingredient = indexes.MultiValueField()
def prepare_ingredient(self, obj):
return [i.name for i in obj.ingredient.all()]
def get_model(self):
return user
def index_queryset(self, using=None):
return self.get_model().objects.all()
创建索引后,您可以像这样进行筛选:
myrecipe = recipe.objects.get(...)
SearchQuerySet().models(user).filter(ingredient__in=myrecipe.recipe_ingredient.all())