2016-02-04 93 views
2

我正在嘗試使用Django REST框架(3.3.1)生成JSON,它應該使用直通模式訂購m2m字段。這在正常的Django視圖中工作 - 排序是榮幸的(即在管理列表中)。但是,使用ModelSerializer的標準DRF集合時,在django模型上指定的貫穿表格不會用於返回的m2m集合的排序。Django REST框架,通過直通表排序m2m序列化

有沒有簡單的方法來實現我之後的排序?或者我需要生成數據並返回自己的DRF響應?

我有以下型號:

class Pitch(models.Model): 
    """ A pitch like 'A4" (A at octave 4) with midi note - ie 60 = middle C (C3) """ 
    name = models.CharField(max_length=5) 
    midi_note = models.IntegerField() 

    def __unicode__(self): 
     return self.name 

    class Meta: 
     ordering = ['midi_note'] 
     verbose_name_plural = 'pitches' 


class Pattern(models.Model): 
    """ ie A Major """ 
    name = models.CharField(max_length=50, default="") 
    pitches = models.ManyToManyField(Pitch, through='PitchPosition') 

    def __unicode__(self): 
     return u"{0}".format(self.name) 


class PitchPosition(models.Model): 
    """ 
    The through table for a pitch in a pattern, needed as 
    scales/arpeggios go up and down, so pitches appear 
    twice in the list 

    """ 
    pattern = models.ForeignKey(Pattern) 
    pitch = models.ForeignKey(Pitch) 
    order = models.IntegerField(default=0) 

    def __unicode__(self): 
     return u"{0} ({1})".format(self.pitch, self.pattern) 

    class Meta: 
     ordering = ['pattern', 'order'] 

序列化與DRF中的數據,通過表順序不被評爲:

class PitchSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Pitch 
     fields = ('name', 'midi_note') 


class PatternSerializer(serializers.ModelSerializer): 
    name = serializers.CharField() 
    pitches = PitchSerializer(many=True) 

    class Meta: 
     model = Pattern 
     fields = ('name', 'pitches') 

產地:

[ 
    { 
     "name": "D Major", 
     "pitches": [ 
      { 
       "name": "D4", 
       "midi_note": 62 
      }, 
      { 
       "name": "D4", 
       "midi_note": 62 
      }, 
      { 
       "name": "E4", 
       "midi_note": 64 
      }, 
      { 
       "name": "E4", 
       "midi_note": 64 
      }, 
      { 
       "name": "F#4", 
       "midi_note": 66 
      }, 
      { 
       "name": "F#4", 
       "midi_note": 66 
      }, 
      { 
       "name": "G4", 
       "midi_note": 67 
      }, 
      { 
       "name": "G4", 
       "midi_note": 67 
      }, 
      { 
       "name": "A4", 
       "midi_note": 69 
      }, 
      { 
       "name": "A4", 
       "midi_note": 69 
      }, 
      { 
       "name": "B4", 
       "midi_note": 71 
      }, 
      { 
       "name": "B4", 
       "midi_note": 71 
      }, 
      { 
       "name": "C#5", 
       "midi_note": 73 
      }, 
      { 
       "name": "C#5", 
       "midi_note": 73 
      }, 
      { 
       "name": "D5", 
       "midi_note": 74 
      } 
     ] 
    } 
] 
+0

目前還不清楚你期望的訂單,你想要按名稱排列的訂購?另外,在JSON中(與許多字典數據結構一樣),根據定義,鍵的順序無意義。消費客戶端可以並且應該根據需要重新排列接收到的數據以用於任何所需的呈現狀態。 – Fiver

+0

關於JSON密鑰的順序不夠有意義。我想要的訂單(或者我想要的JSON數據)是來自PitchPosition模型的'訂單'字段,它具有:class Meta:ordering = ['pattern','order']。就我的目的而言,按照pitchposition.order字段所定義的順序,將模式中的所有音高都足夠了。注意,音調可以在一個模式中出現超過一次 - 即A,B,C,B,A – stephendwolff

回答

0

你可以使用Prefetch對象來控制對象的順序PitchPosition當您將Pattern查詢集傳遞到序列化程序時。

+0

感謝Dhiraj,我會放棄這一點。 – stephendwolff

相關問題