django - 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 而不是一个序列化的对象,不是我想要的其他原因。
我的问题是:这有什么问题,为什么我的核心领域没有从游戏的形式更新?
解决方案
事实证明我在某处丢失了更新表单数据,但我不知道在哪里。我将此方法添加到 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");
});
}
}
我不明白为什么我在表单和验证数据中没有完全相同的字段
推荐阅读
- c# - 从 api 网站下载 .json 时出现 ResponseStatusLine 错误
- kotlin - Kotlin DSL 上下文中的 TeamCity HTTP 请求
- node.js - 如何针对架构中的不同键运行自定义验证?
- android - 如何修复 Android 的启动画面?
- reactjs - 哪个编辑器用于混合应用程序的 Web 开发?
- java - 如何在春季将 ifNull 运算符与 GroupOperation 一起使用
- iot - 我们可以使用 Azure IoT 边缘模块预配下游设备吗?
- javascript - 如何使用 HTML 和 CSS 将按钮均匀地拆分在一行上?
- css - 让两个相邻的元素重叠
- git - 如何通过多次提交检查/列出 PR 中更改的所有文件