DRF обновление существующей модели после добавления значений в несуществующие поля

#python #django #django-models #serialization #django-rest-framework

#python #django #django-модели #сериализация #django-rest-framework

Вопрос:

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

 class CreateBet(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL,related_name="bets",null=True, on_delete=models.CASCADE)
    bet_name= models.CharField(max_length=255)
    amount = models.CharField(max_length=255) 
    scheduled_datetime = models.DateTimeField(null=True,blank=True)
    accepted_user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.SET_NULL,related_name="accept",null=True)
    status = models.BooleanField(default=False)

  

итак, чего я хочу, так это всякий раз, когда я нажимаю:

 router.register('api/bets',BetViewset,'userbets')
  

в этой конечной точке я хочу, чтобы пользователь создавал ставку без добавления в поля accepted_user и status . Но если пользователь нажал:

 router.register('accept_bet',AcceptBetViewset,'accept')
  

эта конечная точка accepted_user будет создана и status будет установлена на True .
в настоящее время мой сериализатор выглядит следующим образом

 class BetCreateSerializer(serializers.ModelSerializer):
    class Meta :
        model = CreateBet
        exclude = ['accepted_user','status']
  

и его api:

 class BetViewset(viewsets.ModelViewSet):
    
    
    permission_classes = [
        permissions.IsAuthenticated
    ]
    serializer_class = BetCreateSerializer
    
    def perform_create(self,serializer):
        serializer.save(owner = self.request.user)
    

    def get_queryset(self):
        today = datetime.date.today()
        return CreateBet.objects.filter(scheduled_datetime__date=today)
  

который отлично работает.

но всякий раз, когда я пытался использовать этот сериализатор :

 class AcceptBetSerializer(serializers.ModelSerializer):
    bet = BetCreateSerializer(many = True , read_only= True)
    class Meta:
        model = CreateBet
        fields ='__all__'
        # def update(self, instance, validated_data):
        #     id = validated_data.pop('id')
        #     object = CreateBet.objects.get(id=id)
        #     object.save(status=True)
            
  

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

 class AcceptBetViewset(viewsets.ModelViewSet):


    serializer_class = AcceptBetSerializer


    permission_classes = [permissions.IsAuthenticated]
    
    
    
    def perform_create(self,serializer):
        print('hii')
        serializer.save(accepted_user = self.request.user,status=True)
    
    def get_queryset(self):
        return CreateBet.objects.filter(accepted_user=self.request.user)

  

работает не так, как я ожидал. всякий раз, когда я пытаюсь принять ставку, вместо этого она обновляется до существующего поля, создается новый объект bet с нулевыми значениями полей для owner , bet_name , amount и scheduled_date . Я перепробовал все с моими ограниченными знаниями.У кого-нибудь есть какие-то предложения? Спасибо!

Ответ №1:

В принципе, похоже, что вы хотите создавать экземпляры CreateBet , а затем позже публиковать обновления для экземпляра?

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

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

Комментарии:

1. Хагарти, да! Вы правы . Я провел целый день, работая с этим. Но, к сожалению, я не могу этого сделать