Вложенный сериализатор с внешним ключом и to_field

МодельStock имеет отношение OneToMany с моделью Data. Я использую поле to_field, чтобы связать их через поле model_number.

class Stock(models.Model):
    model_number = models.CharField(max_length=100, unique=True, null=True)
    model = models.CharField(max_length=100)
    brand = models.CharField(max_length=100)
    msrp = models.IntegerField(default=0)

    def __str__(self):
        return f"{self.brand} - {self.model} - {self.model_number}"


class Data(models.Model):
    model_number = models.ForeignKey(Stock, to_field='model_number', on_delete=models.CASCADE)
    price = models.FloatField()
    date = models.DateField()

    def __str__(self):
        return self.model_number

У меня есть сериализаторы, которые показывают каждый номер модели, а затем вложенные отношения данных.

class DataSerializer(serializers.ModelSerializer):
    class Meta:
        model = Data
        fields = '__all__'


class StockSerializer(serializers.ModelSerializer):
    data = DataSerializer(many=True, read_only=True)

    class Meta:
        model = Stock
        fields = ['brand', 'model', 'model_number', 'msrp', 'data']

Однако в моем представлении API данные вообще не возвращаются. Не знаю, где я ошибаюсь.

Я сделал возможным импорт данных, связанных с внешним ключом модели запасов, через методfield.

stock/serializers.py

from rest_framework import serializers
from .models import Data, Stock

class DataSerializer(serializers.ModelSerializer):
    class Meta:
        model = Data
        fields = '__all__'


class StockSerializer(serializers.ModelSerializer):
    # data = DataSerializer(many=True, read_only=True)
    data = serializers.SerializerMethodField()
    
    def get_data(self, obj):
      datas = Data.objects.filter(model_number=obj.model_number)
      serializer = DataSerializer(datas, many=True)
      return serializer.data
    

    class Meta:
        model = Stock
        fields = '__all__'

stock/views.py

from django.shortcuts import render
from rest_framework.generics import ListAPIView
from .models import Stock
from .serializers import StockSerializer

# Create your views here.


class StockView(ListAPIView):
  queryset = Stock.objects.all()
  serializer_class = StockSerializer
  authentication_classes = []

drf document serializermethodfield

enter image description here

В итоге я решил эту проблему, изменив ForeignKey в своей модели данных. Ошибка также казалась результатом того, что мой postgres не мигрировал должным образом в то время.

class Data(models.Model):
    stock = models.ForeignKey(Stock, related_name='data', on_delete=models.CASCADE)
    model_number = models.CharField(max_length=100, default="")
    price = models.FloatField(blank=True)
    date = models.DateField(blank=True)

    def __str__(self):
        return self.model_number
Вернуться на верх