即使我是一位经验丰富的开发人员,我在Python / Django中还是一个新手,我可能错过了做某件事,或者我试图使某些事情变得不可能...
我正在将Django 3与Python 3.7一起使用
摘要:
我有一个模型A,其中的GenericForeignKey指向模型B或模型C。 设置链接时,对象A可能已经存在于数据库中,因此我调用“ get_or_create”方法重新获取对象(如果该对象已经存在)或创建一个新对象(如果尚不存在)。 在“ get_or_create”之后,我将链接设置为另一个对象。
我试图通过多种方式设置链接,从对象A的实例到对象B的实例,但是每次遇到错误时,我都会寻找一些示例来了解当模型已经实例化时如何设置GenericForeignKey链接但是我没有找到。
我尝试过的事情:
我的代码的最新版本:
对于A类:
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
class A(models.Model):
# ...
number = models.IntegerField(
'Number',
editable=False,
default='-1'
)
content_type = models.ForeignKey(ContentType, on_delete=models.SET_NULL, null=True)
object_id = models.PositiveIntegerField(null=True)
object_srce = GenericForeignKey(ct_field='content_type', fk_field='object_id')
objects = models.Manager()
@classmethod
def get_instance(cls, p_number):
a_objects, created = cls.objects.get_or_create(number=p_number)
return a_objects
def set_obj_data(self, p_object_srce, p_number):
self.number = p_number
self.object_srce.set([p_object_srce])
self.save()
对于B类:
from django.db import models
from apps.A.models import A
from django.contrib.contenttypes.fields import GenericRelation
class B(models.Model):
# ...
a_objects = GenericRelation(A, related_query_name='object_srce')
objects = models.Manager()
def get_a_number(self):
if self.a_objects is None:
return 0
else:
lo_a_objects = A.objects.filter(object_srce = self).first()
return lo_o_objects.number
在其他地方使用:
b_obj = B()
b_obj.save()
a_obj = A.get_instance(l_number)
a_obj.save()
a_obj.set_obj_data(b_obj,l_number)
执行代码时,我得到:
TypeError at /admin/TC/tc/
Direct assignment to the reverse side of a related set is prohibited. Use object_srce.set() instead.
Request Method: POST
Request URL: http://127.0.0.1:8000/admin/TC/tc/
Django Version: 3.0.5
Exception Type: TypeError
Exception Value:
Direct assignment to the reverse side of a related set is prohibited. Use object_srce.set() instead.
Exception Location: C:\Users\myuser\PycharmProjects\test_app\venv\lib\site-packages\django\db\models\fields\related_descriptors.py in __set__, line 546
Python Executable: C:\Users\myuser\PycharmProjects\test_app\venv\Scripts\python.exe
Python Version: 3.7.2
(...)
C:\Users\myuser\PycharmProjects\test_app\apps\A\models.py in set_obj_data
self.object_srce.set([p_object_srce])
->我不理解此错误消息,因为我已经在使用set()方法
您有解决此问题的想法吗?
提前谢谢