#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. Хагарти, да! Вы правы . Я провел целый день, работая с этим. Но, к сожалению, я не могу этого сделать