【发布时间】:2021-03-24 13:49:00
【问题描述】:
我有以下三个模型,
models.py:
class Activity(models.Model):
# ...
objects = models.Manager()
activity = ActivityManager()
kind = models.CharField(max_length=10, choices=KIND_CHOICES)
# ...
class ActivtyA(models.Model):
# ...
activity = models.OneToOneField(
Activity,
on_delete=models.CASCADE,
related_name='A',
)
# ...
class ActivtyB(models.Model):
# ...
activity = models.OneToOneField(
Activity,
on_delete=models.CASCADE,
related_name='B',
)
# ...
还有一名模特经理,
managers.py:
class ActivityManager(models.Manager):
def create_activity(self, validated_data):
# ...
data = validated_data.pop(kind)
act = self.create(**validated_data)
if act.kind == 'A':
# Create ActivityA(act, **data)
elif act.kind == 'B':
# Create ActivityB(act, **data)
# ...
# ...
在模型管理器的create_activity 方法中,我想根据Activity.kind 创建Activty 和ActivityA 或ActivtyB。如果我在管理器中导入这些类,则会导致循环导入错误。
如何在管理器中访问ActivityA 和ActivtyB?
我尝试通过使用信号来做到这一点,但无法做到。
@receiver(post_save, sender=Activity)
def create_activity_details(sender, instance, using, **kwargs):
if instance.kind == 'A':
ActivityA.objects.create(activity=instance, data=????) # Need data to create this object
elif instance.kind == 'A':
ActivityB.objects.create(activity=instance, data=????)
【问题讨论】:
-
ActivityManager示例中的确切问题是什么?那是您的答案中提到的循环导入吗? -
@djvg;是的。我将其添加到问题中。
-
您能否通过在
models.py中定义管理器来防止这些导入问题?还是您真的希望它在单独的managers.py模块中? -
@djvg;该管理器的目的是将业务逻辑与视图和序列化程序分开,同时避免使模型变胖。所以,是的,它需要在一个单独的文件中。
-
或者这似乎是最新的:stackoverflow.com/a/4881693
标签: python django django-models django-rest-framework