Вложенный сериализатор с внешним ключом и 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 = []
В итоге я решил эту проблему, изменив 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