Django RestFramework - сериализатор родительских и дочерних моделей с представлениями БД? - PullRequest
0 голосов
/ 25 мая 2019

Я пытаюсь реализовать сериализатор, который возвращает родительскую запись с дочерними элементами, встроенными в объект json ответа.

Моя модель для родительского и дочернего элементов основана на представлениях базы данных:

class ProductContributorView(models.Model):  # its a model of a view
   id = models.IntegerField(primary_key=True)
   product_id = models.ForeignKey('ProductTitleView', on_delete=models.DO_NOTHING, related_name='contributors')
   sequenceNumber = models.IntegerField()
   name = models.CharField(max_length=180)
   role = models.CharField(max_length=8, null=True)
   description = models.CharField(max_length=1408)

   class Meta:
      managed = False  
      ordering = ['sequenceNumber',]


class ProductTitleView(models.Model):
   id = models.IntegerField(primary_key=True)
   isbn = models.CharField(max_length=80)
   titleText = models.CharField(max_length=300)

   class Meta:
      managed = False  
      ordering = ['titleText', 'isbn',]

Вот сериализаторы:

class ProductContributorViewSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = ProductContributorView
        fields = ('id', 'product_id', 'sequenceNumber', 'name', 'role', 'description')

    def create(self, validated_data):
        contributor = ProductContributorView.objects.create(
            id=validated_data['id'],
            product_id=validated_data['product_id'],
            sequenceNumber=validated_data['sequenceNumber'],
            name=validated_data['name'],
            role=validated_data['role'],
            description=validated_data['description'])
        return contributor


class ProductTitleViewSerializer(serializers.HyperlinkedModelSerializer):

    contributors = serializers.PrimaryKeyRelatedField(many=True, read_only=True)

    class Meta:
        model = ProductTitleView
        fields = ('id', 'isbn', 'titleText', 'contributors')

Вот мнения:

class ProductTitleViewList(generics.ListAPIView):
    queryset = ProductTitleView.objects.all()
    serializer_class = ProductTitleViewSerializer

class ProductContributorViewList(generics.ListAPIView):
    queryset = ProductContributorView.objects.all()
    serializer_class = ProductContributorViewSerializer

Основная идея заключается в том, чтобы участники - автор, иллюстратор и т. Д. - возвращались сназвание книги на основе FK в представлении ProductContributorView, совпадающего с идентификатором в ProductTitleView.

Однако при выполнении этого я получаю следующую ошибку:

1054, "Unknown column 'jester_productcontributorview.product_id_id' in 'field list'"

Я не указалproduct_id_id в списке полей, и я также пытался ссылаться на поле как просто product в списке полей, но он все еще повторяет суффикс _id_id.Надеясь, что кто-нибудь укажет мне документацию, где объясняются соглашения об именах FK, или подскажет, что нужно изменить в списке полей.Спасибо!

1 Ответ

1 голос
/ 25 мая 2019

Вы можете просто попробовать переименовать этот product_id ForeignKey в product.

Это указывает на то, почему он может быть сломан, я подозреваю, что он где-то ломается при проверке сериализаторами ваших моделей относительно именования поля product_id на модели.

Когда вы определяете ForeignKey для модели, для этого поля доступны два свойства. Одним из них является определенное вами свойство, объект ForeignKey, и вы должны использовать его для получения связанной модели . За кулисами Django также создает другое свойство, которое добавляет _id к имени внешнего ключа, это свойство представляет IntegerField в базе данных, в которой хранится отношение. Если вы будете просматривать таблицу в psql, вы увидите столбцы _id (а в вашем случае _id_id).

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