Как создатьAPIView, используя request.user
Здравствуйте, мне интересно, какова лучшая практика для создания новой записи модели с пользователем на основе запроса в Django Rest Framework?
Модели:
class Asset(models.Model):
user = models.ForeignKey(UserAccount, on_delete=models.CASCADE, related_name="assets")
name = models.CharField(max_length=200)
amount = models.DecimalField(max_digits=10, decimal_places=2)
Сериализаторы:
class AssetSerializer(serializers.ModelSerializer):
class Meta:
model = Asset
fields = '__all__'
Виды
class CreateAssetView(generics.CreateAPIView):
serializer_class = AssetSerializer
<Doesn't seem to work, possibly since user isn't in the json>
def perform_create(self, serializer):
serializer.save(user=self.request.user)
В принципе, я хочу иметь возможность отправить POST-запрос {name: 'myasset', amount: '50'}
на эту конечную точку и получить новый актив, сохраненный с полем User, полученным из запроса. Каков наилучший способ сделать это? Спасибо
Чаще всего я делаю это, используя представления на основе функций, а не классов. ..:
В принципе, это также сможет отправить запрос POST
и сохранит пользователя, который запросил пост-запрос.
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework.permissions import IsAuthenticated
@api_view(['POST'])
@permission_classes([IsAuthenticated])
def perform_create(request, pk):
user = request.user
asset= Asset.objects.get(id=pk)
data = request.data
# Create Asset
asset = Asset.objects.create(
user=user,
name=user.first_name,
amount=data['amount '],
)
asset.save()
return Response('Asset Added')
А для возврата данных я создаю другое представление для сериализованных данных где это необходимо. Я уверен, что есть и другие подходы, но этот намного проще и легче сделать.