python - algolia-django 在 algolia 索引中更新多对多模型的问题
问题描述
您好我在使用 algolia django 包时遇到问题。我创建了一个名为 ProviderInfo 的模型,其中包含一个引用另一个名为 Practice 的模型的 ManyToMany 字段。提供者应该能够有多种实践。但是,当我在 django 的管理面板上进行更改时,不会重新索引多对多引用字段。我查看了 github 并找到了一个帖子https://github.com/algolia/algoliasearch-django/issues/202但它似乎不起作用。我在 django 2+ 和 python3.5+ 上。
模型.py
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)
索引.py
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)
管理员.py
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)
解决方案
问题在于 algolia django 包。显然,您只需通过管理面板手动处理索引。在此版本中,您不能使用 python manage.py algolia_reindex 进行自动索引。
推荐阅读
- java - 如何避免相同的对象持久化多次elasticsearch
- excel - 如何将一系列混合的文本和数值转换为单个字符串,其中连续数值相加?
- apache - 将 documentroot 重定向到 conf apache 或 .htccess 中的另一个文件夹
- python - 从行索引的数据帧索引数据帧
- html - 在 div 中居中文本(链接)
- android - 如何在android的谷歌地图中添加自定义标记
- excel - 单元格值更改时自动运行 Excel VBA 宏
- java - 递归生成的东西的迭代器(不预先生成结果)
- cython - 如何创建任意大小的 cython 结构数组
- python - 为什么这不读取文件中的内容?Python