【发布时间】:2022-01-26 01:29:53
【问题描述】:
我正在使用 APIView 为视图编写游戏 API,我需要在 GET 请求中创建游戏回合和游戏会话对象。目标是当用户点击游戏时,每次都会创建一个包含几轮的游戏会话。假设一个游戏会话只包含一轮。
如何在 get 方法中正确创建这些对象?我是否为每个字段分配了一些东西?我应该使用 save 还是应该覆盖两者的 create() 方法?
这是我目前所拥有的:
views.py
def get(self, request, *args, **kwargs):
controller = GameViewController()
gametype = Gametype.objects.all().filter(name="imageLabeler")
gametype_serializer = GametypeSerializer(gametype, many=True)
# while duration is not None:
random_resource = Resource.objects.all().order_by('?').first()
resource_serializer = ResourceSerializer(random_resource)
if request.user is None:
current_user = '1'
else:
current_user = request.user
current_score = 0
gamesession = Gamesession.save({
'id': controller.generate_random_id(Gamesession),
'user': current_user,
'gametype': gametype,
'created': datetime.now(),
})
gameround = Gameround.save({
'id': controller.generate_random_id(Gameround),
'user': current_user,
'gamesession': gamesession,
'created': datetime.now(),
'score': current_score,
})
return Response({'gametype': gametype_serializer.data,
'resource': resource_serializer.data
})
这些是我的模型: models.py
class Gamesession(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True)
gametype = models.ForeignKey(Gametype, on_delete=models.CASCADE)
created = models.DateTimeField(editable=False)
objects = models.Manager()
def save(self, *args, **kwargs):
if not self.id:
self.created = timezone.now()
return super().save(*args, **kwargs)
class Gameround(models.Model):
user = models.ForeignKey(CustomUser, on_delete=models.SET_NULL, null=True)
gamesession = models.ForeignKey(Gamesession, on_delete=models.CASCADE)
created = models.DateTimeField(editable=False)
score = models.PositiveIntegerField(default=0)
objects = models.Manager()
def save(self, *args, **kwargs):
if not self.id:
self.created = timezone.now()
return super().save(*args, **kwargs)
【问题讨论】:
标签: django-models django-rest-framework django-views