Django-elasticsearch-dsl NestedField не синхронизируется с базой данных
Я создал документ django-elasticsearch-dsl
с NestedField
, но по какой-то причине данные для этого NestedField
не извлекаются из базы данных, хотя данные извлекаются из базовой модели. Маппинг для индекса также корректен, включая вложенное поле:
{
"mappings": {
"properties": {
"addresses": {
"type": "nested",
"properties": {
"pk": {
"type": "integer"
},
"postal_code": {
"type": "text"
},
"street_name": {
"type": "text"
},
"street_no": {
"type": "integer"
}
}
},
"country": {
"type": "text"
},
"name": {
"type": "text"
}
}
}
}
Я сделал все в соответствии с официальными документами, я не знаю, что я упустил.
models.py
from django.db import models
# Create your models here.
class City(models.Model):
name = models.CharField(max_length=100)
country = models.CharField(max_length=100)
def __str__(self):
return f"{self.name}, {self.country}"
class Address(models.Model):
city = models.ForeignKey(
City, on_delete=models.CASCADE, related_name="related_city"
)
street_name = models.CharField(max_length=300)
street_no = models.PositiveIntegerField()
postal_code = models.CharField(max_length=6)
def __str__(self):
return f"{self.street_name} {self.street_no} ({self.city.name})"
documents.py
from django_elasticsearch_dsl import Document, fields
from django_elasticsearch_dsl.registries import registry
from .models import City, Address
@registry.register_document
class CityDocument(Document):
addresses = fields.NestedField(
properties={
"street_name": fields.TextField(),
"street_no": fields.IntegerField(),
"postal_code": fields.TextField(),
"pk": fields.IntegerField(),
}
)
class Index:
name = "cities"
class Django:
model = City
fields = ["name", "country"]
related_models = [Address]
def get_queryset(self):
return super().get_queryset().prefetch_related("addresses")
def get_instances_from_related(self, related_instance):
if isinstance(related_instance, Address):
return related_instance.city
Попробуйте добавить .all()
def get_instances_from_related(self, related_instance):
if isinstance(related_instance, Address):
return related_instance.city.all()