#python #django #algolia
#python #django #algolia
Вопрос:
привет, у меня возникли проблемы с использованием пакета algolia django. Я создал модель под названием ProviderInfo с полем ManyToMany, которое ссылается на другую модель под названием Practice. Поставщик должен иметь возможность использовать несколько практик. Однако, когда я вношу изменения в панель администратора в django, ссылочные поля «многие ко многим» не переиндексируются. Я заглянул в github и нашел сообщение https://github.com/algolia/algoliasearch-django/issues/202 но, похоже, это не работает. Я работаю на django 2 и python3.5 .
Models.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)
Index.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)
Admin.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)
Ответ №1:
Проблема связана с пакетом algolia django. По-видимому, вам нужно просто вручную обработать индексацию через панель администратора. Вы не можете использовать python manage.py algolia_reindex автоматически индексируется в этом выпуске.