Как я могу получить данные из другой модели для создания объекта в 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(), но это не работает. Я также пробовал здесь и здесь и многие другие решения, но это не работает или, возможно, я не понимаю. Пожалуйста, помогите.

Вернуться на верх