如何在Django rest框架上request.method == PUT,POST

垃圾的

我正在使用Django REST Framework序列化某些模型。

这是我的Match序列化器模型

class MatchSerializer(serializers.ModelSerializer):

    field = serializers.SlugRelatedField(queryset=Field.objects.all(),slug_field='name')

    class Meta:
        model = Match
        fields = ('url', 'id', 'home_team', 'away_team', 'field', 'match_date', 'check_match_away_team', 'status_challenge', 'home_team_players_accept', 'away_team_players_accept', 'home_team_players_cancel', 'away_team_players_cancel', 'fichaje_players_match',)

Match模型中,字段如下:

  • home_teamaway_team属性,是ForeingKeyTeam模型的,而不是null

  • field属性也是一个ForeignKey值,不能为null。

  • status_challenge是一个CharField且不为null

  • home_team_players_acceptaway_team_players_accepthome_team_players_cancelaway_team_players_cancel,和fichaje_players_match领域都有ManyToMany我的客户关系User模型。这些是在我的Match模型中以这种方式定义的,例如:

    class Match(models.Model):
    
        home_team_players_accept = models.ManyToManyField(
            settings.AUTH_USER_MODEL,
            related_name='home_team_players_accept',
            blank=True,)
    
        away_team_players_accept = models.ManyToManyField(
            settings.AUTH_USER_MODEL,
            related_name='away_team_players_accept',
            blank=True,)
    
        home_team_players_cancel = models.ManyToManyField(
            settings.AUTH_USER_MODEL,
            related_name='home_team_players_cancel',
            blank=True,)
    
        away_team_players_cancel = models.ManyToManyField(
            settings.AUTH_USER_MODEL,
            related_name='away_team_players_cancel',
            blank=True,)
    
        fichaje_players_match = models.ManyToManyField(
            settings.AUTH_USER_MODEL,
            related_name='fichaje_players_match',
            blank=True,)
    

我的情况是,当我通过curl和移动iOS应用客户端更新一个Match对象时,遇到以下情况:

我有这样的记录比赛:

{
    "url": "https://myserver/api/matchs/29/",
    "id": 29,
    "home_team": "Manchester United",
    "away_team": "Sempiternos FC",
    "field": "Joga Bonito",
    "match_date": "2017-01-02T09:00:05Z",
    "check_match_away_team": true,
    "status_challenge": "Aceptado",
    "home_team_players_accept": [
        "paoc",
        "nuevo"
    ],
    "away_team_players_accept": [
        "mike",
        "giraldoesteban"
    ],
    "home_team_players_cancel": [
        "erick"
    ],
    "away_team_players_cancel": [
        "Bluse"
    ],
    "fichaje_players_match": [
        "Oliver"
    ]
}

当我通过PUT操作curl工具命令这个记录,执行只是在我的更新status_challenge字段从改变自己的价值Aceptado,以Pendiente本次更新PUT做,我home_team_players_acceptaway_team_players_accepthome_team_players_cancelaway_team_players_cancel,和fichaje_players_match阵列字段设置为空或空的,它们的值删除:

bgarcial@elpug : ~
[0] % curl -X PUT https://myserver/api/matchs/29/ -d "home_team=Manchester United&away_team=Sempiternos FC&field=Joga Bonito&match_date=2017-01-2T09:00:05Z&check_match_away_team=true&status_challenge=Pendiente" 
{"url":"https://myserver/api/matchs/29/","id":29,"home_team":"Manchester United","away_team":"Sempiternos FC","field":"Joga Bonito","match_date":"2017-01-02T09:00:05Z","check_match_away_team":true,"status_challenge":"Pendiente","home_team_players_accept":[],"away_team_players_accept":[],"home_team_players_cancel":[],"away_team_players_cancel":[],"fichaje_players_match":[]}%           
bgarcial@elpug : ~
[0] % 

目前,我的比赛记录是这样的:

在此处输入图片说明

当我通过使用API​​的移动应用程序执行更新时,也会发生这种情况

我尝试在这种情况下request.method == 'PUT'以这种方式处理案件:

class MatchViewSet(viewsets.ModelViewSet):

    queryset = Match.objects.all()
    serializer_class = MatchSerializer
    filter_fields = ('home_team','away_team', 'status_challenge', 'fichaje_players_match', )

    @api_view(['PUT'])
    def match_detail(request, pk):
        if request.method == 'PUT':
            serializer = MatchSerializer()
            if serializer.is_valid():
                serializer.save()
                return Response(serializer)
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

结果是一样的,我目前不知道如何解决这种情况,指南对我来说还不够清楚

如何在不使上面引用的玩家字段为空白或删除其内容的情况下更新status_challenge模型序列化器Match的字段?


更新

可传递性是某种方式,例如:

有我的自定义User模型

class User(AbstractBaseUser, PermissionsMixin):
    ... other attributes ...   

    team = models.ForeignKey(
        'games_information.Team',
        null=True,
        blank=True,
        verbose_name='Equipo en el que juega',    
    )

User串行:

class UserSerializer(serializers.ModelSerializer):
    username = serializers.CharField(validators=[UniqueValidator(queryset=User.objects.all(), message='Lo sentimos, existe un fichaje con este nombre de usuario')])
    email = serializers.EmailField(validators=[UniqueValidator(queryset=User.objects.all(), message='Lo sentimos, alguien ya ha sido fichado con este correo electrónico')])

    def create(self, validated_data):
        password = validated_data.pop('password', None)
        instance = self.Meta.model(**validated_data)
        if password is not None:
            instance.set_password(password)
        instance.save()
        return instance

    def update(self, instance, validated_data):
        for attr, value in validated_data.items():
            if attr == 'password':
                instance.set_password(value)
            else:
                setattr(instance, attr, value)
        instance.save()
        return instance

    class Meta:
        model = User
        fields = ('url', 'username', 'password', 'first_name','last_name',
                  'age', 'sex', 'photo', 'email', 'is_player', 'team',
                  'position', 'is_staff', 'is_active', 'is_superuser',
                  'is_player', 'weight', 'height', 'nickname',
                  'number_matches', 'accomplished_matches',
                  'time_available', 'leg_profile', 'number_shirt_preferred',
                  'team_support', 'player_preferred', 'last_login',)

Team模型具有ManyToManyUser建模字段

class Team(models.Model):

    ... other fields ...

    players = models.ManyToManyField(
        settings.AUTH_USER_MODEL,
        related_name='players',
        blank=True,
    )

这是我的 TeamSerializer

class TeamSerializer(serializers.ModelSerializer):

    name = serializers.CharField(validators=[UniqueValidator(queryset=Team.objects.all(), message='Lo sentimos, ya existe un equipo con este nombre')])
    place_origin = serializers.SlugRelatedField(queryset=Field.objects.all(),slug_field='name')

    class Meta:
        model = Team
        fields = ('url', 'name', 'image', 'players', 'modality', 'branch', 'category', 'category_name', 'place_origin', 'game_day',)

比赛模式,有home_team_players_acceptaway_team_players_accepthome_team_players_cancelaway_team_players_cancelfichaje_players_match领域,都在ManyToMany与关系User模型(settings.AUTH_USER_MODEL

class Match(models.Model):

       ... other fields ...
       STATUS_CHALLENGE_CHOICES = (
           (ACCEPTED_CHALLENGE, u'Aceptado'),
           (PENDING_CHALLENGE, u'Pendiente'),
           (CANCELLED_CHALLENGE, u'Cancelado'),
           (FICHAJE, u'Fichaje'),
       ) 
       status_challenge = models.CharField(
           choices=STATUS_CHALLENGE_CHOICES,
           max_length=40,
           default=True,
           blank=False,
           verbose_name='Estado del desafío'
        )
        home_team_players_accept = models.ManyToManyField(
            settings.AUTH_USER_MODEL,
            related_name='home_team_players_accept',
            blank=True,)

        away_team_players_accept = models.ManyToManyField(
            settings.AUTH_USER_MODEL,
            related_name='away_team_players_accept',
            blank=True,)

        home_team_players_cancel = models.ManyToManyField(
            settings.AUTH_USER_MODEL,
            related_name='home_team_players_cancel',
            blank=True,)

        away_team_players_cancel = models.ManyToManyField(
            settings.AUTH_USER_MODEL,
            related_name='away_team_players_cancel',
            blank=True,)

        fichaje_players_match = models.ManyToManyField(
            settings.AUTH_USER_MODEL,
            related_name='fichaje_players_match',
            blank=True,)

这是我的Match序列化器:

class MatchSerializer(serializers.ModelSerializer):

        field = serializers.SlugRelatedField(queryset=Field.objects.all(),slug_field='name')

        class Meta:
            model = Match
            fields = ('url', 'id', 'home_team', 'away_team', 'field', 'match_date', 'check_match_away_team', 'status_challenge', 'home_team_players_accept', 'away_team_players_accept', 'home_team_players_cancel', 'away_team_players_cancel', 'fichaje_players_match',)

不便之处是我在上文进行了最初的描述。当我申请更新到比赛终点的记录,在该领域status_challenge中的记录home_team_players_acceptaway_team_players_accepthome_team_players_cancelaway_team_players_cancelfichaje_players_match字段被删除或设置为空白

德米特里·希利亚耶夫(Dmitry Shilyaev)

您需要部分更新。PUT调用update(),而PATCH调用partial_update()。唯一的区别是partial = True(PATCH)或partial = False(PUT)。在视图中初始化序列化程序时,您可以设置自己的部分。

您可以像在Django REST框架代码(mixins.py)中那样,通过PUT执行部分更新:

def update(self, request, *args, **kwargs):
    kwargs['partial'] = True
    return super(YourCustomView, self).update(request, *args, **kwargs)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

POST请求在beego框架上被视为OPTIONS

REST中的PUT与POST

PUT POST是幂等的(REST)

Django Rest框架:request.Post与request.data?

令牌身份验证在Django Rest框架上的生产中不起作用

如何在django-rest-framework POST中包含ForeignKey

POST django rest框架后重定向

在w页中使用django表单时,如何处理request.method =='POST'?

令牌认证在Django Rest框架上不起作用

序列化器Django Rest框架上字段的值的属性错误

使用Django rest框架上传多个文件而不使用表单

如何在Django Rest框架中允许POST进行更新操作

如何在Django Rest Framework中处理并行的PUT / PATCH请求?(覆盖问题)

如何在Django REST框架中正确设置HTTP_405_METHOD_NOT_ALLOWED状态代码的Allow标头

如何获取用户名以显示在序列化器Django Rest框架上

如何在Django框架上检测所有模型的插入或更新操作?

如何使用Django Rest框架上传多张图片?

如何在获得的框架上添加文本?

如何在html的实际屏幕框架上添加阴影?

如何在Django中接收POST数据,应该使用Django表单还是Django REST框架?

如何在Robot框架中制作POST(ReST)API

如何在离子框架上动态生成标题?

PHP在不使用$ _SERVER ['REQUEST_METHOD']的情况下检测请求类型(GET,POST,PUT或DELETE)

在Django框架上呈现页面的问题

如何在 django rest 框架中为嵌套序列化程序正确创建 POST 方法

Django Rest Framework POST 和 PUT 外键 ModelSerializer

如何在 Django REST 框架中隐藏 POST 表单?

如何在 angular 的 post/delete/put-request 中添加我自己的函数?

DJango 不执行 request.method == "post" with ajax 数据提交