【问题标题】:How can I map objects in Django?如何在 Django 中映射对象?
【发布时间】:2017-10-28 18:42:15
【问题描述】:

假设我在我的 POST 方法中有三个字段 - field1field2field3 但是在 POST 方法中 field2field3 在添加到数据库期间应该具有相同的值。因此,无需手动添加 field2=2field3=2。我只能添加field1=1field2=2,然后field3=2 将自动添加到此正文中,最后整个 3 个字段将添加到数据库中。我想知道它应该如何以最佳方式完成?是否应该在视图中完成?我尝试如下所示的方式。

views.py:

class UserObject(GenericAPIView):

    def get_serializer_class(self, *args, **kwargs):
        if self.request.method == 'POST':
            return ObjectPostSerializer
        return ObjectSerializer

    def post(self, request, user_id):

        serializer = ObjectPostSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(user_id=user_id)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

serializers.py:

class ObjectPostSerializer(serializers.ModelSerializer):

    def __init__(self, *args, **kwargs):
        super(ObjectPostSerializer, self).__init__(*args, **kwargs)

        for key in self.fields:
            self.fields['field3'].required = False

    class Meta:

        model=Object
        field3 = model.field2

        fields = ('__all__')

【问题讨论】:

  • 如果field2field3 在数据库中始终具有相同的值,为什么需要这两个字段?你不能取消其中一个吗?但要回答这个问题,一个好的方法是编写serializer.save(),这样它会忽略field3 的值,并为两个数据库列使用field2 的值。
  • @JohnGordon 因为将来只有 field2 会更新,所以 field3 表示初始值。您可以查看更新问题中的代码吗?我该如何解决?
  • 我对 Django 对象序列化器没有任何经验,所以我无法评论具体细节,但看起来你的想法是正确的。
  • @JohnGordon 但是 field3 没有添加到数据库中。

标签: python django python-3.x django-rest-framework django-views


【解决方案1】:

也许你可以使用简单的逻辑,从post serializer中排除field3,并将其设置在模型的save方法上

在序列化器中:

class ObjectPostSerializer(serializers.ModelSerializer):

    class Meta:
        model=Object
        exclude = ('field3', )

在模型中:

class Object(model.Model):
    # YOU FIELDS DECLARE HERE

    def save(self, *args, **kwargs):
        if not self.pk:
            self.field3 = self.field2
        super(Object, self).save(*args, **kwargs)

【讨论】:

  • 但在PUTGET 等其他方法中,我需要拥有整个模型。只有POST我想少用一个字段。
  • 为什么你的序列化器的名字是PostSerializer
  • 因为 POST 方法我尝试创建单独的序列化程序 - ObjectPostSerializer。其他方法有ObjectSerializer
  • 现在您想更改逻辑并为所有情况使用一个序列化程序?
  • 不,我认为将 POST 的序列化程序和其他方法的另一个序列化程序分开会更容易。因为在ObjectPostSerializer 中我可以设置self.fields['field3'].required = False 等,但在其他方法中我需要添加此字段。
猜你喜欢
  • 1970-01-01
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2018-08-14
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多