Джанго: Как сериализовать отношения один ко многим - PullRequest
0 голосов
/ 07 марта 2019

Я не могу понять, как сериализовать отношения один-ко-многим в Django. Информация, похоже, даже не появляется.

Мои модели

class DataInfo(models.Model):
    component_id = models.CharField(max_length=4)
    component_name = models.CharField(max_length=255)
    data_id = models.IntegerField()
    data_name = models.CharField(max_length=255)


class Data(models.Model):
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='data_owner')
    subject = models.CharField(max_length=255)
    init_date = models.DateField()
    fin_date = models.DateField()
    data_info = models.ForeignKey(DataInfo, related_name="datainfo", on_delete=models.CASCADE)

My View

class DataViewSet(viewsets.ModelViewSet):
    serializer_class = serializers.DataSerializer

    def list(self, request):
        data = models.Data.objects.using(db_to_use).select_related('data_info').all()
        return Response(self.get_serializer(data, many=True).data)

Мои сериализаторы

class DataInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.DataInfo
        fields = ('id', 'component_id', 'component_name', 'data_id', 'data_name')

class DataSerializer(serializers.ModelSerializer):
    datainfo = DataInfoSerializer(source="datainfo", read_only=True)
    class Meta:
        model = models.Data
        fields = ('id', 'subject', 'init_date', 'fin_date', 'owner_id', 'data_info_id', 'datainfo')

По сути, я просто пытаюсь сделать соединение междуData и DataInfo, показывающие все поля Data и DataInfo в одном представлении (не вложенные).Я попытался сделать select_related, поместив атрибут источника, кажется, ничего не работает.Ответ, который я получаю, - это просто все поля таблицы Data без полей таблицы DataInfo.Я что-то упустил с сериализацией?

1 Ответ

2 голосов
/ 07 марта 2019

Вы пытались добавить many=True туда, куда добавили DataInfoSerializer?

То есть

class DataSerializer(serializers.ModelSerializer):
    datainfo = DataInfoSerializer(source="datainfo", read_only=True, many=True)
    # ...

(Кроме того, Data, DataInfo, data_info и datainfo - довольно ужасные имена. В частности, related_name s должны быть как-то множественным числом или подразумевать множественное число, если только они не находятся в OneToOneFields. )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...