2016-11-23 87 views
3

我有三个型号:Django的序列化与定制很多型号很多映射

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将返回给我的只是实体,并且它忽略了entity_alert_relationship字段,它是我用来将实体映射到多个字段中的不同警报的EntityToAlertMap的一部分。我的问题是,我怎么能序列化DistinctAlert同时保持实体/关系领域

+2

看看这个问题:http://stackoverflow.com/questions/17256724/include-intermediary-through-model-in-responses-in-django-rest-framework。接受的答案是你正在寻找的。 – AKS

+0

在上述评论中发布的帖子不帮你找到答案吗? – AKS

回答

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')