Как я могу получить данные из другой модели для создания объекта в CreateAPIView в DRF
У меня есть две модели и соответствующие им сериализаторы:
Модель обзора:
class Review(models.Model):
store = models.ForeignKey(Store, to_field='id', null=True, on_delete=models.SET_NULL)
customer = models.ForeignKey(CustomerProfile, to_field='id', null=True, on_delete=models.SET_NULL)
product = models.ForeignKey(Product, on_delete=models.CASCADE)
feedback_image = models.ImageField(upload_to='images', blank=True)
comment = models.TextField(blank=True)
store_rating = models.PositiveIntegerField(default=0)
product_rating = models.PositiveIntegerField(default=0)
Просмотр сериализатора
class ReviewSerializer(serializers.ModelSerializer):
feedback_image = serializers.ImageField(required=False)
class Meta:
model = Review
fields = '__all__'
Модель заказа:
class Order(models.Model):
store = models.ForeignKey(Store, to_field='id', null=True, on_delete=models.SET_NULL)
customer = models.ForeignKey(CustomerProfile, to_field='id', null=True, on_delete=models.SET_NULL)
order_ref = models.CharField(max_length=20, unique=True, null=True)
...
Сериализатор заказов
class OrderSerializer(serializers.ModelSerializer):
customer = serializers.ReadOnlyField(source='customer.email')
class Meta:
model = Order
fields = ['order_ref', 'store', 'customer',...]
Я хочу создать экземпляр обзора, но в полезной нагрузке клиента должны быть только следующие поля:
{
"order_ref": "10001111401218982",
"comment": "black black",
"store_rating": 5,
"product_rating": 4,
"product": 1
}
Как вы видите выше, в полезной нагрузке отсутствуют поля store
и customer
. Эти поля находятся в модели Order
и могут быть получены с помощью order_ref
. Я пытаюсь переопределить generics.CreateAPIView
для модели Review, чтобы я мог использовать order_ref
для получения недостающих полей, а затем создать объект Review.
Просмотр:
class ReviewCreate(generics.CreateAPIView):
permission_classes = [AllowAny]
queryset = Review.objects.all()
serializer_class = ReviewSerializer
def create(self, request, *args, **kwargs):
data = request.data
order_ref = data['order_ref']
try:
order = Order.objects.get(order_ref=order_ref)
review = Review.objects.create(
store = order.store.id, # I need this field from order object
customer = order.customer, # and this field from order object
product = data['product'],
product_rating = data['product_rating'],
store_rating = data['store_rating'],
comment = data['comment'],
# feedback_image = '' # this is not a compulsory field and doesn't matter
)
review.save()
serializer = ReviewSerializer(review)
return Response(serializer.data, status=status.HTTP_201_CREATED)
except:
return Response(status=status.HTTP_400_BAD_REQUEST)
Это работает, когда я жестко кодирую полезную нагрузку, но я получаю следующую ошибку, когда я пытаюсь переопределить createAPIView
, как указано выше. Я также пробовал def post()
и def perform_create()
, но это не работает. Я также пробовал здесь и здесь и многие другие решения, но это не работает или, возможно, я не понимаю. Пожалуйста, помогите.