【问题标题】:How to fill detail of Foreign key used in other models of Python class如何填写 Python 类其他模型中使用的外键的详细信息
【发布时间】:2018-07-16 04:18:34
【问题描述】:

我有以下用户和订单类:

class User(models.Model):
     id = models.AutoField(db_column='id', primary_key=True)
     username = models.CharField(max_length=240)
     password = models.CharField(max_length=128)
     last_login = models.DateTimeField(blank=True, null=True)
     is_superuser = models.IntegerField()

订单表

class Order(models.Model):
    orderid = models.AutoField(db_column='orderId', primary_key=True)
    orderuserid = models.ForeignKey('User', models.DO_NOTHING, related_name='users', db_column='orderUserId')
    orderamount = models.IntegerField(db_column='orderAmount', blank=True, null=True) 

现在我的问题是我想从现有用户创建一个新订单,那么当用户创建订单时,如何自动填写 Order 表中的 orderuserid 字段。我很困惑序列化器现在将如何工作。

我的序列化程序类是

class OrderSerializer(serializers.ModelSerializer):
    orderid = serializers.IntegerField
    orderuserid = serializers.HiddenField(default=serializers.CurrentUserDefault())
    orderamount = serializers.CharField

    class Meta:
        model = Orders
        fields = ('orderid','orderuserid','orderamount')

    def create(self, validated_data):
        return Orders.objects.create(**validated_data)

和查看

class OrdersView(APIView):
    def post(self, request):
        serializer = OrderSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)

并且错误是 /api/orders 处的 KeyError '请求'

【问题讨论】:

  • 你的意思是当用户例如访问/new/order时他不想输入他的用户名?

标签: python django django-models django-rest-framework foreign-keys


【解决方案1】:

您可以像这样简单地在上下文中发送当前登录用户并在序列化程序的创建方法中使用它。

查看

class OrdersView(APIView):
    def post(self, request):
        serializer = OrderSerializer(data=request.data, context={'user': request.user})
        if serializer.is_valid():
            serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)

序列化器

class OrderSerializer(serializers.ModelSerializer):
    orderid = serializers.IntegerField()
    orderuserid = serializers.ReadOnlyField(required=False)
    orderamount = serializers.CharField()

    class Meta:
        model = Orders
        fields = ('orderid','orderuserid','orderamount')

    def create(self, validated_data):
        validated_data.update({'orderuserid': self.context.get('user')})
        return Orders.objects.create(**validated_data)

【讨论】:

  • 谢谢,当我作为 iOS 开发人员第一次尝试后端时,我发现了另一个想法,即我将用户 ID 保存在我的应用钥匙串中,然后直接在表单中传递该 ID。跨度>
【解决方案2】:

在新的 DRF 中,您可以这样做:

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

如果用户通过身份验证,它将填充orderuserid

希望对你有帮助。

【讨论】:

  • 我对 DRF 了解不多,但这不是不安全,因为用户可以更改输入值并伪装成其他人吗?
  • @mohammedqudah 这将仅输入经过身份验证的用户的 ID。因此,假装他人的唯一方法就是使用他们的帐户登录。
  • 我知道,但如果他检查代码,他会看到<input type="hidden" value="some id, and simply he change it">
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多