Создание записи в модели django через POST-запрос - PullRequest
0 голосов
/ 14 апреля 2020

Я довольно плохо знаком с Django и Rest Framework. Так что я верю вам, ребята, чтобы помочь мне исправить мою проблему здесь. Я на Python 2.7 и Django 1.11.

Мои модели -

class Item(models.Model):
    title = models.CharField(max_length=140)
    user = models.ForeignKey(User)
    created_date = models.DateTimeField(auto_now_add=True)
    due_date = models.DateTimeField(blank=True, null=True)
    completed = models.BooleanField()
    completed_date = models.DateTimeField(blank=True, null=True)

    def save(self,force_insert=False, force_update=False):
        i = datetime.datetime.now(pytz.utc)
        in_tz = pytz.timezone("Asia/Calcutta")
        i = i.astimezone(in_tz)
        # If Item is being marked complete, set the completed_date
        if self.completed:
            self.completed_date = i
        super(Item, self).save(force_insert, force_update)

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=30, null=True, blank=True)
    last_name = models.CharField(max_length=30, null=True, blank=True)
    ... ... ...

Я пытаюсь опубликовать запись в модели товара, которая должна получить электронное письмо от пользователя. заголовки запроса и должны создать отношение внешнего ключа для этой конкретной записи.

Мой сериализатор для модели элемента -

class ItemSerializer(serializers.ModelSerializer):
    user = serializers.RelatedField(source='User',read_only=True)
    class Meta:
        model = Item
        fields = '__all__'

Мой набор представлений для модели элемента -

class ItemViewset(viewsets.ModelViewSet):
    serializer_class = ItemSerializer
    queryset = Item.objects.all()

    def perform_create(self, serializer):
        print 'Im in here', self.request.user
        user_id = User.objects.get(email=self.request.user)
        serializer.save(user= user_id)

Я проверил несколько блогов и других вопросов по StackOverflow и дошел до этого момента.

Теперь, когда я пытаюсь опубликовать запись, я получаю ошибку TypeError, как показано ниже

Got a `TypeError` when calling `Item.objects.create()`.
This may be because you have a writable field on the serializer class that is not a valid argument to `Item.objects.create()`.
You may need to make the field read-only, or override the ItemSerializer.create() method to handle this correctly.
Original exception was:
 Traceback (most recent call last):
  File "/../env/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 943, in create
    instance = ModelClass._default_manager.create(**validated_data)
  File "/../env/local/lib/python2.7/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/../env/local/lib/python2.7/site-packages/django/db/models/query.py", line 394, in create
    obj.save(force_insert=True, using=self.db)
TypeError: save() got an unexpected keyword argument 'force_insert'

Пожалуйста, помогите я в исправлении этого для моего случая использования. У меня мало времени, чтобы сделать это.

Большое спасибо.

1 Ответ

1 голос
/ 14 апреля 2020

Я думаю, вам не нужно переопределять perform_create. Все, что вам нужно сделать, это изменить метод сериализатора create:

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = '__all__'
        read_only_fields = ('user')

    def create(self, validated_data):
        validated_data['user'] = self.context["request"].user
        return super(ItemSerializer, self).create(validated_data)

Здесь вы сможете получить объект запроса в сериализаторе, поскольку ViewSet отправляет request объект через extra context. Я просто добавляю объект user из сериализатора в validated_data. Я также избавился от поля user, вместо этого добавил его к read_only_fields.

...