DRF вложенный JSON не может получить детализацию пользователя - PullRequest
0 голосов
/ 12 июля 2019

Я использую фреймворк django rest, и я строю организационную и пользовательскую функциональность.Сведения о моих моделях, сериализаторе и наборе моделей выглядят следующим образом.

class OrganizationLatest(models.Model):
    name = models.CharField(max_length=500, blank=True, null=True)
    address = models.CharField(max_length=500, blank=True, null=True)
    user = models.ForeignKey(User, default="", null=True, blank=True)
    createdat = models.DateTimeField()
    updatedat = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'organization'

Сериализатор для организации и пользователя выглядит следующим образом

class organizationLatestSerializer(serializers.ModelSerializer):

    class Meta:
        model=OrganizationLatest
        fields =('name','address','user')

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('pk','username',)
        read_only_fields = ['id','username']

class OrganizationLatestVieset(viewsets.ModelViewSet):
       queryset = OrganizationLatest.objects.all()  # dummy objec
       serializer_class = organizationLatestSerializer

Остальные API возвращаются

[
    {
        "name": "Org1",
        "address": null,
        "user": 7
    },
    {
        "name": "Org2",
        "address": null,
        "user": 3
    },

]

Но мне нужен JSON в этом формате,

[
  {
    "name": "Org1",
    "address": "xxxxx",
    "user": [
      {
        "username": "jhon",
        "email": "a@g.com"
      }
    ]
  },
  {
    "name": "Org2",
    "address": "998,abc",
    "user": [
      {
        "username": "jhon",
        "email": "a@g.com"
      }
    ]
  }      
]

Пожалуйста, дайте мне знать, как мне достичь ожидаемого формата JSON.

Спасибо всем,

1 Ответ

1 голос
/ 12 июля 2019

Предполагая, что OrganizationLatest модель, как вы определили в вопросе, приведенный ниже фрагмент кода даст желаемый JSON, но поле user будет объектом, или вы можете сказать детали пользователя связанного пользователя с экземпляром OrganizationLatest. .


class OrganizationUserSerializer(serializers.ModelSerializer):

    class Meta:
        model = User
        fields = ('username','email',)
        read_only_fields = ['id','username']

class OrganizationLatestSerializer(serializers.ModelSerializer):
    user = OrganizationUserSerializer()
    class Meta:
        model=OrganizationLatest
        fields =('name','address','user')

class OrganizationLatestVieset(viewsets.ModelViewSet):
       queryset = OrganizationLatest.objects.all() 
       serializer_class = organizationLatestSerializer

Теперь вы получите вывод json в конечной точке списка следующим образом: -

[
  {
    "name": "Org1",
    "address": "xxxxx",
    "user": {
      "username": "jhon",
      "email": "a@g.com"
    }
  },
  {
    "name": "Org2",
    "address": "998,abc",
    "user": {
      "username": "jhon",
      "email": "a@g.com"
    }
  }
]

Примечание Я не рекомендую вам изменять UserSerializer и использовать его вместо OrganizationUserSerializer, чтобы показать пользователя в OrganizationLatestSerializer

...