使用外键引用保存序列化程序时Django失败

2024-05-23 16:22:07 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个有外键参考的模型,在几周内运行得非常好。最后我不得不向模型添加另一个外键引用,现在我无法使用序列化程序保存任何记录。我应该提到我使用的是Django 2.1。 以下是我使用的模型(为简单起见,删除了一些字段):

class Finding(models.Model): finding_id = models.IntegerField(null=False, blank=False, primary_key=True, db_index=True) name = models.CharField(null=True, blank=True, max_length=255) web_app = models.ForeignKey(WebApplication, on_delete=models.CASCADE) q_id = models.ForeignKey(StagingQkb, on_delete=models.CASCADE)

新的FK是qu id字段。这只是一个简单的整数。实际上,我已经删除了旧表,而新表仍然是完全空的,所以我知道这不是现有数据的问题(具有外键的表仍然完整)。在保存之前的发现时,我只会给出“webapp”的WebApplication对象的PK。据我所知,这仍然有效。当以同样的方式插入'q_id'字段时,它会抱怨它需要一个int/string/bytes,而不是StagingQkb对象。好吧,我没有给它一个StagingQkb对象,所以给它什么呢!在

这是序列化程序:

我输入到序列化程序的数据如下所示:

当我将数据插入序列化程序时,我正在执行以下操作:

>>> fs = FindingSerializer(data=data) >>> fs.is_valid() True >>> fs.save()

运行上述代码后,我得到的错误如下所示:

Traceback (most recent call last): File "<input>", line 1, in <module> File "/opt/oss/python35/lib/python3.5/site-packages/rest_framework/serializers.py", line 214, in save self.instance = self.create(validated_data) File "/opt/oss/python35/lib/python3.5/site-packages/rest_framework/serializers.py", line 959, in create raise TypeError(msg) TypeError: Got a `TypeError` when calling `Finding.objects.create()`. This may be because you have a writable field on the serializer class that is not a valid argument to `Finding.objects.create()`. You may need to make the field read-only, or override the FindingSerializer.create() method to handle this correctly. Original exception was: Traceback (most recent call last): File "/opt/oss/python35/lib/python3.5/site-packages/rest_framework/serializers.py", line 940, in create instance = ModelClass._default_manager.create(**validated_data) File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/manager.py", line 82, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/query.py", line 413, in create obj.save(force_insert=True, using=self.db) File "/home/dpz3w0q/AutonomousPrimeD/autonomousprimed/Finding/models.py", line 83, in save q_id=self.q_id) File "/home/dpz3w0q/AutonomousPrimeD/autonomousprimed/Finding/models.py", line 173, in evaluate if ScoreMatrix.objects.filter(q_id=q_id).count() > 0: File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/manager.py", line 82, in manager_method return getattr(self.get_queryset(), name)(*args, **kwargs) File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/query.py", line 844, in filter return self._filter_or_exclude(False, *args, **kwargs) File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/query.py", line 862, in _filter_or_exclude clone.query.add_q(Q(*args, **kwargs)) File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1263, in add_q clause, _ = self._add_q(q_object, self.used_aliases) File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1287, in _add_q split_subq=split_subq, File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1225, in build_filter condition = self.build_lookup(lookups, col, value) File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/sql/query.py", line 1096, in build_lookup lookup = lookup_class(lhs, rhs) File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/lookups.py", line 20, in __init__ self.rhs = self.get_prep_lookup() File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/lookups.py", line 70, in get_prep_lookup return self.lhs.output_field.get_prep_value(self.rhs) File "/opt/oss/python35/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 1807, in get_prep_value return int(value) TypeError: int() argument must be a string, a bytes-like object or a number, not 'StagingQkb'

我完全被困在这里了。我没有改变向序列化程序传递数据的方式,所以我真的不知道我做错了什么。如果有人能帮我解决这个问题,我会非常感激的!在


Tags: djangoinpyselfiddbmodelslib
1条回答
网友
1楼 · 发布于 2024-05-23 16:22:07

多亏了@WillKeeling,我意识到在我的save()方法中有一个Finding.q_id的引用,在进行FK更改后,我忘记了更新它。foreign表的PK是qkb_id,因此我将引用改为Finding.q_id.qkb_标识我还保存了这个模型。在

相关问题 更多 >