Django的REST的API多对多的JSON

问题描述:

送我使用Django,其余的框架,我尝试创建的Django模型的方法,可以返回其他对象信息,以serializers.py serializers.pyDjango的REST的API多对多的JSON

class MySerializer(serializers.ModelSerializer): 
    performer = PerformerSerializer(
    source='get_performers', 
    read_only=True,many=True 
    ) 

    class Meta: 
     model = Master 
     fields = ('first_name', 'performer') 

class Stream(models.Model): 
    master = models.ForeignKey('Master', null=True, default=None) 

class Catalog(models.Model): 
    performer = models.ForeignKey('Performer', blank=True) 
    stream = models.ForeignKey('Stream', null=True, default=None) 
class Performer(models.Model): 
    name = models.CharField(max_length=255) 
class Master(models.Model): 
    first_name = models.CharField(max_length=255) 

    def get_performers(self): 
     streams = Stream.objects.filter(master=self) 
     catalogs = Catalog.objects.filter(stream__in=streams).order_by('-datetime')[:10] 
     catalogs = reversed(catalogs) 
     performers = Performer.objects.filter(catalog__in=catalogs) 
     return performers 

我得到error.By休息apy我得到等于对象,但它是错误的。

{ 
    "first_name": "Master", 
    "performer": [ 
     { 
      "id": 1, 
     }, 
     { 
      "id": 1, 
     } 
} 
+0

为什么你不能只发送目录和呼叫表演在前端像{{singlecatalog.performer.name }}或者你可以使用catalogs.objects.values('performer.name')发送值列表 – Vaibhav

+0

@Vicmathur因为我使用rest-api并且不混合前后端 –

+0

如果你使用的是django rest框架,那么它可以使用序列化器完成..如果你使用的是DRF,那么我可以给你一个例子.. – zaidfazil

您可以使用property装饰你的模型方法,并在ModelSerializer使用它,

def get_performers(self): 
    streams = Stream.objects.filter(master=self) 
    catalogs = Catalog.objects.filter(stream__in=streams).order_by('-datetime')[:10] 
    catalogs = reversed(catalogs) 
    performers = Performer.objects.filter(catalog__in=catalogs).distinct() 
    return performers 
+0

它不是JSON可序列化 –

+0

你是否在'ModelSerializer'中使用它? – zaidfazil

+0

是的,我用它与2个变种。发送列表和查询。在查询变体中,我看到了表演者,但没有什么不同。表演者是平等的,但它是错误的 –