Django Rest Framework: как связать объект с пользователем при публикации объекта - PullRequest
0 голосов
/ 28 февраля 2019

Я новичок в создании REST API, поэтому могу что-то неправильно понять.Я создаю REST API с использованием Django Rest Framework.И я пытаюсь создать объект и отправить его из моего мобильного приложения.

Однако API возвращает 400. Я думаю, что он все еще не может связать объект с пользователем запроса, и мне интересно, как это сделать.

models.py

class Item(models.Model):
    item_name = models.CharField()
    created_at = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(CustomUser, on_delete=models.CASCADE)

serializers.py

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('item_name', 'created_by')

и views.py

class ListItems(generics.ListCreateAPIView):
    queryset = Item.objects.all()
    serializer_class = ItemSerializer

Что я хочу знать, так этокак связать объект с пользователем запроса при публикации объекта так же, как мы делаем

if form.is_valid():
    item = form.save(commit=False)
    item.created_by = request.user
    item.save()        

Ответы [ 4 ]

0 голосов
/ 23 марта 2019

У меня работает

models.py

class Category(models.Model):
   name = models.CharField('Category', max_length=200, unique=True, help_text='Name of the category')
   slug = models.SlugField('Slug', max_length=100, db_index=True, unique=True, help_text='Name of the category in format URL')

   def __str__(self):
       return (self.name)

   def save(self, *args, **kwargs):
       self.slug = slugify(self.name)     
       super(Category, self).save(*args, **kwargs)    

serializers.py

 class CategorySerializer(serializers.ModelSerializer):
   class Meta:
       model = Category
       fields = [
           'id', 'name', 'slug'
       ]
       read_only_fields = [
          'slug', 
       ]

Наконец, я получаю пользователя в представлении, прежде чем сохранитьпост.

views.py

class CategoryList(APIView):te a new category instance.

   permission_classes = (IsAuthenticatedOrReadOnly,)

   def get(self, request, format=None):
       categories = Category.objects.all()
       serializer = CategorySerializer(categories, many=True)
       return Response(serializer.data, status=status.HTTP_200_OK)

   def post(self, request, format=None):
       serializer = CategorySerializer(data=request.data)
       if serializer.is_valid():
           serializer.save(created_by=self.request.user)
           Response(serializer.data, status=status.HTTP_200_OK)
       return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
0 голосов
/ 28 февраля 2019

Один из возможных способов перезаписи serializer_create метода.Поскольку user не связан с request.data, сначала нам нужно убедиться, что это поле write_only, а также необходимо назначить текущего пользователя из self.context.request.user модели ModelSerializer.Следующее дополнение должно решить проблему.

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('item_name', 'created_by')
        extra_kwargs = {'created_by': {'write_only': True}}

    def create(self, validated_data):
        item = Item(
            item_name=validated_data['item_name'],
            created_by=self.context.request.user
        )

        item.save()
        return item

Ссылка ссылка

0 голосов
/ 28 февраля 2019

Я думаю, что самый простой подход такой:

class ItemSerializer(serializers.ModelSerializer):

 created_by = serializers.HiddenField(
    default=serializers.CurrentUserDefault()
)

Ссылку можно найти здесь

0 голосов
/ 28 февраля 2019
class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('item_name',)

class ListItems(generics.ListCreateAPIView):
    ...
    def perform_create(self, serializer):
        serializer.save(created_by=self.request.user)

вы можете сделать это

...