Django序列化具有自定义多对多映射的模型

3

我有三个模型:

class DistinctAlert(models.Model):
    entities = models.ManyToManyField(to='Entity', db_index=True, through='EntityToAlertMap')

class Entity(models.Model):
    entity_instance = models.ManyToManyField(EntityInstance)

class EntityToAlertMap(models.Model):
    entity = models.ForeignKey(Entity, on_delete=models.CASCADE)
    distinct_alert = models.ForeignKey(DistinctAlert, on_delete=models.CASCADE)
    entity_alert_relationship_label = models.ForeignKey(EntityAlertRelationshipLabel, on_delete=models.CASCADE,
                                                        null=True)

除了DistinctAlertEntity两个额外字段外,我的序列化程序如下:

class EntitySerializer(serializers.ModelSerializer):
    entity_instance = EntityInstanceSerializer(many=True)

    class Meta:
        model = Entity
        fields = ('id', 'entity_instance')

class EntityInstanceSerializer(serializers.ModelSerializer):
    entity_type = EntityTypeSerializer()

    class Meta:
        model = EntityInstance
        fields = ('label', 'entity_type')

class DistinctAlertSerializer(serializers.ModelSerializer):
    entities = EntitySerializer(many=True)

    class Meta:
        model = DistinctAlert
        #TODO how do I serialize custom mapping?
        fields = ('id', 'entities')

我的问题是,使用这个API,它只会返回实体,并且错过了在我用于将实体映射到ManyToMany字段中的不同警报的EntityToAlertMap的“entity_alert_relationship”字段。我的问题是,如何序列化DistinctAlert同时保持实体/关系字段。

2
看一下这个问题:https://dev59.com/nGQm5IYBdhLWcg3w4CTA。被接受的答案就是你要找的。 - AKS
以上评论中的帖子没有帮助您找到答案吗? - AKS
1个回答

2
您可以为 EntityToAlertMap 编写序列化器。
class EntityToAlertMap(serializers.ModelSerializer):
    class Meta:
        model = EntityToAlertMap
        fields = ('entity', 'distinct_alert', 'entity_alert_relationship_label')

然后你可以通过相关管理器检索所有相关的EntityToAlertMap实例。

class DistinctAlertSerializer(serializers.ModelSerializer):
    entities = EntitySerializer(many=True)
    entity_to_alert_map = EntityToAlertMap(source='entitytoalertmap_set', many=True)

    class Meta:
        model = DistinctAlert
        fields = ('id', 'entities', 'entity_to_alert_map')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接