2017-04-18 6 views
0

私は多くの例とドキュメントに従ってきましたが、この権利を得ることはできません。モデルを逆転させるために信号を使用するM2M

モデルを更新するたびにElasticsearchインデックスを作成しようとしています。 'autoindex'を使用してもM2Mは記録されません。私はラッパーelasticsearch-pyあるdjango-elasticsearchhere)を使用しています

  1. 私はTag内の値を変更すると、それはすべてのItemsのインデックスを更新する必要があるです。

    私が試してみると、モデルによってまだインポートされていないため、タグを見つけることができません。connect(tag_index, sender=Tag.item.through)

    これはどのように正しく達成されますか?

    class Tag(models.Model): 
        name = models.CharField(max_length=500, blank=True) 
        taglevel = models.IntegerField(null=True, blank=True) 
    
    def tag_index(instance, **kwargs): 
        Task.instance.es.do_index() 
    
    class Item(EsIndexable, models.Model): 
        title = models.CharField(max_length=100, blank=True) 
        tag = models.ManyToManyField('Tag', blank=True) 
    
        class Elasticsearch(EsIndexable.Elasticsearch): 
         serializer_class = TaskEsSerializer 
         fields = ['title', 'tag'] 
    
    @receiver(post_save, sender= Task) 
    def index_elastic(instance, **kwargs): 
        instance.es.do_index() 
    
    m2m_changed.connect(tag_index, sender=Item.tag.through) 
    

答えて

0

[OK]それは私が思ったように「スマート」ではありません。各モデルの機能を参照する必要があります

class Tag(models.Model): 
    name = models.CharField(max_length=500, blank=True) 
    taglevel = models.IntegerField(null=True, blank=True) 

@receiver(post_save, sender= Tag) 
@receiver(post_delete, sender= Tag) 
def index_tag(instance, **kwargs): 
    Item.objects.get().es.do_index() 

def tag_index(instance, **kwargs): 
    instance.es.do_index() 

class Item(EsIndexable, models.Model): 
    title = models.CharField(max_length=100, blank=True) 
    tag = models.ManyToManyField('Tag', blank=True) 

    class Elasticsearch(EsIndexable.Elasticsearch): 
     serializer_class = ItemEsSerializer 
     fields = ['title', 'tag'] 

@receiver(post_save, sender= Item) 
def index_elastic(instance, **kwargs): 
    instance.es.do_index() 
関連する問題