【问题标题】:DRF Updating an existing model after adding values to non existing fieldsDRF 在向非现有字段添加值后更新现有模型
【发布时间】:2020-10-10 14:40:05
【问题描述】:

我正在尝试创建一个投注应用程序,以便用户可以创建投注并挑战其他 .但我无法创建新赌注,因为我将接受赌注的用户放置在同一个模型实例上: 这就是我的模型的样子。

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_userstatus 。但是如果用户点击:

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)

没有按我预期的方式工作。每当我尝试接受投注时,它会更新到现有字段,它正在创建一个新的投注对象,其中 ownerbet_nameamountscheduled_date 的字段值为空。我用我有限的知识尝试了一切。有人有什么建议吗?谢谢!

【问题讨论】:

    标签: python django django-models serialization django-rest-framework


    【解决方案1】:

    基本上听起来您想创建CreateBet 的实例,然后稍后将更新发布到该实例?

    我认为你的思路是正确的,但我认为你的代码可能比现在更简单。

    我的建议是阅读DRF tutorial,然后是文档,并深入了解它是如何组合在一起的。从长远来看,这将为您节省大量时间,而不是试图让 SO 用户为您解决问题。

    【讨论】:

    • 哈格蒂,啊!你说的对 。我花了一整天的时间来处理这个。但是,很遗憾我做不到
    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 2018-06-14
    • 2020-02-13
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    相关资源
    最近更新 更多