我正在尝试序列化一个字段,该字段包含与另一个模型的多对多关系。 我使用drf-haystack通过haystack(elasticsearch)序列化结果。
通常,我会在modelsearchserializer中包括一个用于m2mfield的m2mfield序列化程序,但是以某种方式在以后重建索引时,该序列化给出了一个错误,表明它无法序列化。
此m2mfield不必是可搜索的。
索引模型:
class ModelIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
title = indexes.CharField(model_attr='title', boost=2.5)
model_id = indexes.IntegerField(model_attr='id')
m2mfield = indexes.MultiValueField()
date = indexes.DateField(model_attr='date')
site_id = indexes.IntegerField()
def get_model(self):
return Model
def prepare_m2mfield(self, obj):
return [m2mfield for m2mfield in obj.m2mfield.all()]
def prepare_site_id(self, obj):
return obj.site.id
def index_queryset(self, using=None):
# Used when the entire index for model is updated.
return self.get_model().objects.all().filter(date__lte=datetime.datetime.now()).prefetch_related('m2mfield')
序列化器:
class ModelSearchSerializer(HaystackSerializer):
/* Tried including a serializer for m2mfield here, but didnt work */
class Meta:
index_classes = [ModelIndex]
fields = ['title', 'text', 'date', 'm2mfield', 'model_id']
错误消息:
elasticsearch.exceptions.SerializationError: ({'id': 'testdata.model.3', 'django_ct': 'testdata.model', 'django_id': '3', 'text': 'nog 1\n<p>&nbsp;fewfewefwfe</p>\n', 'title': 'nog 1', 'model_id': 3, 'm2mfields': [<M2mfield: homepage>], 'date': '2019-04-24T00:00:00', 'site_id': 31}, TypeError("Unable to serialize <M2mfield: homepage> (type: <class 'main.models.M2mfield'>)"))
我尝试重建索引时收到此错误消息
答案 0 :(得分:0)
错误消息正确:您正在尝试序列化M2mfield
实例的复杂值,这是不可能的。在prepare_m2mfield()
中,您应该返回一个简单的可序列化的值。在您的情况下,可能是list
个中的dict
,其中每个dict
代表您要在搜索索引中的M2mfield
中的字段值。