简体   繁体   中英

Nested JSON output for Primary and Foreign key Django Rest Framework

Iam using Django 3.2 with Restframework. I have a Model as a for a Primary key named Tag and a Model connected as a foreign key named TagItem.

I tried to get a nested JSON output for it but its not working as expected.

Models.py

class Tags(models.Model):
    tagId = models.CharField(primary_key=True, max_length=100,default=1)
    section = models.CharField(max_length=100)
class TagItem(models.Model):
    tagId= models.ForeignKey(Tags, on_delete=models.CASCADE,default=1)
    select = models.BooleanField(default=False)
    name = models.CharField(max_length=50)

views.py

def get_tag_details(request):
    if request.method == 'GET':
        tag = Tags.objects.all()
        tagitem = TagItem.objects.all()

        TagSerializeobj = TagsSerializer(tag,many=True)
        TagItemSerializeobj = TagItemSerializer(tagitem, many=True)
        result = {}
        result['tag'] = TagSerializeobj.data
        for item in TagItemSerializeobj:
            if item.tagId == result['tag'].tagId:
                result['tagItem'] = item
        return Response(result)

Error: 'ListSerializer' object is not iterable How to iterate of get items nested under related Tags only.

Required output

{
      "id": 1,
      "section": "crafts",
      "items": [
        {
          "id": "10",
          "select": false,
          "name": "Wood"
        },
        {
          "id": "11",
          "select": false,
          "name": "Clay"
        }
    ]
},
   {
      "id": 2,
      "section": "states",
      "items": [
        {
          "id": "20",
          "select": false,
          "name": "Andhra Pradesh"
        },
        {
          "id": "21",
          "select": false,
          "name": "Arunachal Pradesh"
        },
    ]
}

You don't need to do all those processing in your views. ModelSerializer can do it for you, so you can just define a model serializer for TagItem that is nested on a model serializer for Tag so something like:

class TagItemModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = TagItem
        fields = '__all__'


class TagModelSerializer(serializers.ModelSerializer):
    items = serializers.SerializerMethodField()

    class Meta:
        model = Tag
        fields = '__all__'

    def get_items(self, obj):
        return TagItemModelSerializer(obj.tag_items.all(), many=True)

And in your views:

serializer = TagModelSerializer(Tags.objects.all(), many=True)
return Response(serializer.data)

尝试分配时出现意外的关键字错误

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM