【问题标题】:Creating a record in django model through a POST request通过 POST 请求在 django 模型中创建记录
【发布时间】:2020-07-26 19:34:43
【问题描述】:

我对 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)
    ... ... ...

我正在尝试向 Item 模型发布一条记录,该模型应从请求标头获取用户电子邮件,并应为该特定记录创建外键关系。

我的 Item 模型序列化器-

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'

请帮助我为我的用例解决此问题。我没时间完成这项工作。

非常感谢。

【问题讨论】:

标签: django python-2.7 django-rest-framework


【解决方案1】:

我认为您不需要覆盖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 通过extra context 发送request 对象。我只是将序列化程序中的user 对象添加到validated_data。我还删除了user 字段,而是将其添加到read_only_fields

【讨论】:

  • 谢谢@ruddra。我试过这个方法。我已经从 ViewSet 中删除了 perform_create 方法。我没有得到这个序列化程序的请求对象。因此出现以下错误'ItemSerializer' object has no attribute 'request'
  • 糟糕。我的错。我确定了答案。请再试一次。
  • 是的,我在您编辑之前已经尝试过,并且存在相同的 TypeError。 TypeError: save() got an unexpected keyword argument 'force_insert'
  • 请分享完整的堆栈跟踪
  • 非常感谢。我忽略了模型中的保存方法。我稍微调整了一下,你的解决方案奏效了。
猜你喜欢
  • 2017-07-23
  • 1970-01-01
  • 2018-09-26
  • 2021-11-14
  • 2019-08-08
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
相关资源
最近更新 更多