创建对象后Django更新GenericForeignKey

时间:2020-08-20 10:23:43

标签: django django-models

即使我是一位经验丰富的开发人员,我在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()方法

您有解决此问题的想法吗?

提前谢谢

0 个答案:

没有答案