首页 > 解决方案 > DRF 序列化程序更新说反向外键字段为空,即使它有数据

问题描述

我正在尝试更新模型,但序列化程序说我的反向外键字段为空,即使它有数据(并且在我运行 get 请求时它返回数据)。

楷模:

匹配团队模型

class MatchTeam(models.Model):
  captain = models.ForeignKey(
      User,
      on_delete=models.CASCADE,
      related_name='match_teams_captained'
  )
  teammates = models.ManyToManyField(
      User,
      blank=True,
      related_name='match_teammates'
  )

  match = models.ForeignKey(
      MatchModel,
      on_delete=models.CASCADE,
      related_name='teams'
  )

匹配模型

class MatchModel(models.Model):
  TYPES = (
      (1, "Ex1"),
      (2, "Ex2"),
      (3, "Ex3"),
      (4, "Ex4"),
  )

  is_available = models.BooleanField()
  is_started = models.BooleanField()
  is_finished = models.BooleanField()
  is_deleted = models.BooleanField()
  type = models.IntegerField(choices=TYPES)
  team_size = models. PositiveSmallIntegerField()
  num_teams = models. PositiveSmallIntegerField()
  created_at = models.DateTimeField(editable=False)

  # Foreign Keys
  host = models.ForeignKey(
      User,
      related_name='matches_hosted',
      on_delete=models.CASCADE,
  )
  winning_team = models.OneToOneField(
      'MatchTeam',
      on_delete=models.CASCADE,
      null=True,
      blank=True,
      related_name='+'
  )

  def save(self, *args, **kwargs):
    if not self.id:
      self.created_at = timezone.now()

    return super(MatchModel, self).save(*args, **kwargs)

我正在尝试在我的序列化程序中更新 MatchTeam 模型,但是当我通过 pk 获取我的 MatchModel 时,它说“teams”为空,即使在我检查数据库或运行获取请求时它有数据。

视图.py

def put(self, request, pk, format=None):
    match = self.get_object(pk)

    serializer = MatchModelSerializer(match, data=request.data)
    if serializer.is_valid():
      serializer.save()
      return Response(serializer.data, status=status.HTTP_201_CREATED)

    print(serializer.errors)
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

  def get_object(self, pk):
    try:
      return MatchModel.objects.get(pk=pk)
    except MatchModel.DoesNotExist:
      raise Http404

序列化器:

class MatchModelSerializer(serializers.ModelSerializer):
  type = ChoicesField(choices=MatchModel.TYPES)
  host = UserModelSerializer(many=False)
  teams = MatchTeamSerializer(many=True)

  class Meta:
    model = MatchModel
    fields = (
        'id',
        'is_available',
        'is_started',
        'is_finished',
        'is_deleted',
        'type',
        'team_size',
        'num_teams',
        'host',
        'teams',
        'result_votes',
        'created_at'
    )

标签: djangodjango-modelsdjango-rest-frameworkdjango-serializer

解决方案


推荐阅读