algolia-django与algolia指数中更新的多对多模型有关

问题描述 投票:0回答:1

嗨,我有使用algolia django包的问题。我创建了一个名为ProviderInfo的模型,其中包含一个ManyToMany字段,该字段引用另一个名为Practice的模型。提供者应该能够有多种做法。但是,当我在django中对管理面板进行更改时,不会重新编制多对多参考字段。我查看了github并发现了一个帖子https://github.com/algolia/algoliasearch-django/issues/202但它似乎不起作用。我在django 2+和python3.5 +上。

models.朋友

class Practice(models.Model):
    CHOICES = [
            ('AK', 'AK'),
            ('AL', 'AL'),
            ('AR', 'AR'),
            ('AZ', 'AZ'),
            ('CA', 'CA'),
            ('CO', 'CO'),
            ('CT', 'CT'),
            ('DE', 'DE'),
            ('FL', 'FL'),
            ('GA', 'GA'),
            ('HI', 'HI'),
            ('IA', 'IA'),
            ('ID', 'ID'),
            ('IL', 'IL'),
            ('IN', 'IN'),
            ('KS', 'KS'),
            ('KY', 'KY'),
            ('LA', 'LA'),
            ('MA', 'MA'),
            ('MD', 'MD'),
            ('ME', 'ME'),
            ('MI', 'MI'),
            ('MN', 'MN'),
            ('MO', 'MO'),
            ('MS', 'MS'),
            ('MT', 'MT'),
            ('NC', 'NC'),
            ('ND', 'ND'),
            ('NE', 'NE'),
            ('NH', 'NH'),
            ('NJ', 'NJ'),
            ('NM', 'NM'),
            ('NV', 'NV'),
            ('NY', 'NY'),
            ('OH', 'OH'),
            ('OK', 'OK'),
            ('OR', 'OR'),
            ('PA', 'PA'),
            ('RI', 'RI'),
            ('SC', 'SC'),
            ('SD', 'SD'),
            ('TN', 'TN'),
            ('TX', 'TX'),
            ('UT', 'UT'),
            ('VA', 'VA'),
            ('VT', 'VT'),
            ('WA', 'WA'),
            ('WI', 'WI'),
            ('WV', 'WV'),
            ('WY', 'WY')
        ]
    user = models.ManyToManyField(User)
    name = models.CharField(blank=False, max_length=255, unique=True)
    address_line_1 = models.CharField(blank=False, max_length=255)
    address_line_2 = models.CharField(blank=False, max_length=255)
    city = models.CharField(blank=False, max_length=255)
    state = models.CharField(blank=False, choices=CHOICES, max_length=255)
    zip_code = models.IntegerField(blank=False)
    latitude = models.DecimalField(blank=False, decimal_places=6, max_digits=15)
    longitude = models.DecimalField(blank=False, decimal_places=6, max_digits=15)
    def location(self):
        return (self.latitude, self.longitude)

class ProviderInfo(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    user_profile = models.OneToOneField(UserProfile, on_delete=models.CASCADE)
    practice = models.ManyToManyField(Practice)
    specialty = models.ManyToManyField(Specialty)
    npi = models.IntegerField(blank=False, unique=True)
    def first_name(self):
        return self.user.first_name
    def last_name(self):
        return self.user.last_name
    def middle_name(self):
        return self.user_profile.middle_name
    def specialty_name(self):
        return [specialty.name for specialty in self.specialty.all()]
    def practice_id(self):
        return [practice.id for practice in self.practice.all()]
    def address_line_1(self):
        return [practice.address_line_1 for practice in self.practice.all()]
    def address(self):
        for practice in self.practice.all():
            return f"{practice.address_line_1}, {practice.address_line_2}\n{practice.city},{practice.state} {practice.zip_code}"
    def location(self):
        for practice in self.practice.all():
            return (practice.latitude, practice.longitude) 

index.朋友

class PracticeIndex(AlgoliaIndex):
    name = 'PracticeIndex'
    fields = ['name', 'address_line_1', 'address_line_2', 'city', 'state', 'zip_code']
    geo_field = 'location'

class ProviderIndex(AlgoliaIndex):
    name = 'ProviderIndex'
    fields = ['practice_id', 'npi', 'specialty_name', 'address_line_1',
        'first_name', 'last_name', 'middle_name',
        'address']
    settings = {
        'searchableAttributes': ['address_line_1', 'address']
        }
    geo_field = 'location'

algoliasearch.register(ProviderInfo, ProviderIndex)
algoliasearch.register(Practice, PracticeIndex)

admin.朋友

class PracticeAdmin(admin.ModelAdmin):
    class Meta:
        model = Practice
    def response_add(self, request, obj: Practice, post_url_continue=None):
        # Ensure we update Algolia's index once all many-to-many fields have been updated.
        algoliasearch_django.save_record(obj)

        return super().response_add(request=request, obj=obj, post_url_continue=post_url_continue)
    def response_change(self, request, obj: Practice):
        # Ensure we update Algolia's index once all many-to-many fields have been updated.
        algoliasearch_django.save_record(obj)

        return super().response_change(request=request, obj=obj)
# Register your models here.
admin.site.register(ProviderInfo)
admin.site.register(Specialty)
admin.site.register(Practice, PracticeAdmin)
admin.site.register(BoardCertification)
admin.site.register(AwardsRecognition)
admin.site.register(EducationTraining)
admin.site.register(ProfessionalMembership)
admin.site.register(Language)
admin.site.register(Review)
admin.site.register(Insurance)
python django algolia
1个回答
0
投票

问题在于algolia django包。显然,您需要通过管理面板手动处理索引。您不能在此版本中使用python manage.py algolia_reindex进行自动索引。

© www.soinside.com 2019 - 2024. All rights reserved.