首页 > 解决方案 > Django - 更新外键关系

问题描述

我在 Django 上的基本用法有问题(我的第一次)。我正在写一个街机经理,有游戏和核心(模拟器),这意味着我在游戏中有一个核心领域。

这是模型文件:

class Core(models.Model):
    name = models.CharField(max_length=255)
    path = models.CharField(max_length=255)
    bios = models.CharField(max_length=255, default="")

    def __str__(self):
        return 'Core {}'.format(self.pk)


class Game(models.Model):
    name = models.CharField(max_length=255)
    path = models.CharField(max_length=255)
    description = models.TextField()
    logo = models.FileField(blank=True, null=True, upload_to="games/logos/")
    is_archived = models.BooleanField(default=False)
    core = models.ForeignKey(Core, on_delete=models.PROTECT, related_name="games", default=1)

    def __str__(self):
        return self.name

这是观点(也许并不有趣):

class CoreViewSet(viewsets.ModelViewSet):
    serializer_class = CoreSerializer
    queryset = Core.objects.all()
    permission_classes = [IsAuthenticated]
    


class GameViewSet(viewsets.ModelViewSet):
    serializer_class = GameSerializer
    queryset = Game.objects.filter(is_archived=False)
    permission_classes = [IsAuthenticated]

这是序列化程序:

class CoreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Core
        fields = '__all__'

class GameSerializer(serializers.ModelSerializer):
    nb_terminals = serializers.ReadOnlyField()
    total_donations = serializers.ReadOnlyField()
    core = CoreSerializer(many=False, read_only=False)

    class Meta:
        model = Game
        fields = '__all__'

目前我可以从数据库中创建、更改和删除核心,但修改游戏的核心(外键)是不可能的,我不知道为什么。我只会改变,如果我使用

core = serializers.PrimaryKeyRelatedField(queryset=Core.objects.all(), many=False)

但是核心只是一个 id 而不是一个序列化的对象,不是我想要的其他原因。

我的问题是:这有什么问题,为什么我的核心领域没有从游戏的形式更新?

标签: djangoforeign-keysserialization

解决方案


事实证明我在某处丢失了更新表单数据,但我不知道在哪里。我将此方法添加到 GameSerializer 但经过验证的数据仅包含字段 {'name': 'a', 'path': 'a', 'description': 'a', 'is_archived': False} without core_id

def update(self, instance, validated_data):
    print(validated_data)
    instance.core.id = validated_data.pop("core_id")
    return instance

表格如下所示:

edit: function() {
  if (this.game) {
    let form = new FormData();
    form.append("name", this.game.name);
    form.append("path", this.game.path);
    form.append("description", this.game.description);
    form.append("core_id", this.selectedCore.id);
    
    this.$http
      .put("game/" + this.$route.params.id + "/", form)
      .then(resp => {
        this.game = resp.data;
        this.$router.push("/games");
      });
  }
}

我不明白为什么我在表单和验证数据中没有完全相同的字段


推荐阅读