2016-04-30 17 views
1

Sagen wir, Sie haben 1k Objekte, von denen jedes 10-50 Tags hat.Django "Ähnliche Objekte" basierend auf ähnlichen Tag-Sets

Für ein beliebiges Objekt muss eine Liste von Objekten vorhanden sein, die mit den meisten Stichwörtern Schlüsselwörter haben.

Noch innerhalb der Django Parameter kenne ich keine Möglichkeit, so abzufragen.

Gibt es so etwas im Django oder sollte ich einen Algorithmus außerhalb von djangos Einschränkungen schreiben?


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) 

Dies ist mit Postgres und die taggit Erweiterung (taggit der "similars" Option einen Fehler hat)

+0

Bitte die entsprechenden Modelle hinzufügen. –

+0

Ich suche nach passenden Tags ... Modell hinzugefügt. – Pipsqweek

+0

Funktioniert 'some_object.tags.similar_objects()'? –

Antwort

1

Django Taggit ein TaggableManager bietet in Zusammenarbeit mit ihrem API zu helfen. Es bietet eine similar_objects() Methode, die eine Liste von Objekten zurückgibt, die ähnlich einem bestimmten Objekt in absteigender Reihenfolge der Ähnlichkeit markiert sind.

Vom docs:

similar_objects()
Gibt ein list (kein faul QuerySet) anderer Objekte in ähnlicher Weise wie diese markiert, bestellt mit ähnlichsten zuerst. Jedes Objekt in der Liste ist mit einem similar_tags Attribut versehen, die Anzahl der Tags, die es mit diesem Objekt teilt.

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