Django многие ко многим сериализатор инвертировать вложенное представление JSON - PullRequest
0 голосов
/ 31 мая 2018

в Django имеют отношение многие ко многим, где я использую selected_related для извлечения данных связанных таблиц.Тем не менее, данные связанных таблиц вложены в каждую запись, я хотел бы инвертировать отношения, возможно ли это без специального сериализатора?

, чтобы перейти:родительские отношения:

[
  {
    "parent_items": ""Parent Item Number 1",
    "id": 1,   
    "item": {
        "id": 1,
        "description": "Sub Item 1",
      }, 
     { 
     "item": {
        "id": 2,
        "description": "Sub Item 2 ",
  },

},
{  
    "parent_items": " Parent Item Number 2",
    "id": 2,

    "item": {
        "id": 1,
        "description": "SubItem Item 2",
  }  ............

]

А вот Сериализатор, Модель и представление.

Модели:

class MainItem(models.Model):
   id = models.IntegerField(primary_key=True)
   description = models.CharField(max_length=50) 

class SubItem(models.Model):
  """Equates to parent items"""
  id = models.IntegerField(primary_key=True) 
  main_item = models.ForeignKey(MainItem, null=False)
  description = models.CharField(max_length=50) 


 class Main(models.Model):
  id = models.AutoField(primary_key=True)
  href = models.CharField(max_length=250)
  sub_items = models.ManyToManyField(SubItem)

Сериализатор:

class SubItemSerializer(ModelSerializer):
    class Meta:
        model = SubItem
        fields = '__all__'
        depth = 1

Вид:

class ItemsView(APIView):
      def get(self, request):

      items = SubItems.objects.select_related('main_item').all()
      issue_ser = SubItemSerializer(issues, many=True)

      return Response(issue_ser.data)

1 Ответ

0 голосов
/ 31 мая 2018

Вы должны переписать свой код, чтобы он основывался на MainItem вместо SubItem.

Обратите внимание, что вы можете получить все связанные подпункты, используя атрибут MainItem subitem_set.<modelname>_set - это обратное имя по умолчанию для отношения многие-к-одному в Django.

Поэтому попробуйте что-то вроде этого:

class MainItemSerializer(ModelSerializer):
    class Meta:
        model = MainItem
        fields = ('id', 'description', 'subitem_set')
        depth = 1

class ItemsView(APIView):
      def get(self, request):
          items = MainItem.objects.prefetch_related('subitem_set').all()
          issue_ser = MainItemSerializer(issues, many=True)

          return Response(issue_ser.data)
...