2015-07-06 2 views
7

मेरे पास खाना पकाने व्यंजनों के साथ एक Django डीबी है। मैं उन सभी उपयोगकर्ताओं से पूछना चाहता हूं जिनके पास नुस्खा बनाने के लिए कम से कम 80% तत्व हैं। मुझे यह कैसे हासिल होगा?Django कई क्षेत्र, 80% सबसेट/मैच के लिए चेक कैसे प्राप्त करें?

या मैं उन उपयोगकर्ताओं के लिए क्वेरी कैसे करूं जो नुस्खा के लिए केवल 1 घटक गायब हैं?

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 

उत्तर

3

मैं इसके लिए 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() 

अनुक्रमित के बाद बनाया गया है आप केवल घटक या सामग्री की सूची द्वारा फ़िल्टर कर सकते हैं, हैस्टैक प्रासंगिक वस्तुओं द्वारा खोजे गए सभी मापदंडों को वापस लाएगा, जो प्रासंगिकता से क्रमबद्ध हैं। इसके बाद आप प्रासंगिकता में स्कोर के लिए 80% मानचित्र कर सकते हैं और अपनी आवश्यक राशि के साथ प्रासंगिकता वाले आइटम को फ़िल्टर कर सकते हैं।

SearchQuerySet().models(job_opening).filter(recipe_ingredient__in=['ingredient1', 'ingredient2', 'ingredient3']) 

संपादित

संपादित प्रश्न पढ़ने के बाद, हम मूल रूप से जहाँ हम job_opening इस्तेमाल किया recipe उपयोग करना होगा। और ऐसा लगता है कि आप प्रासंगिक उपयोगकर्ताओं को नहीं ढूंढना चाहते हैं, न कि व्यंजनों।

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()) 
+0

मैंने पूछा इसे पूरा करने के आप सूचकांक करने के लिए उपयोगकर्ता मॉडल के बजाय मूल job_opening मॉडल के लिए होता है गलत सवाल, मुझे खेद है। मैंने इसे संपादित किया, क्या आप एक नज़र देख सकते हैं? – dvc

+0

@dvc मैंने अपना उत्तर – Charl

+0

अपडेट किया है धन्यवाद, लेकिन मैं के साथ ऐसा करने में सक्षम हूं। रेसिपी में। Scipe_ingredient.all(): उपयोगकर्ता = उपयोगकर्ता.फिल्टर (ingredient__id = s.id) मैं कैसे प्राप्त करूं 80% मैच या उपयोगकर्ता जो नुस्खा के लिए केवल 1 घटक गायब हैं? – dvc

संबंधित मुद्दे