在Django中创建模型时自动创建相关对象

jin

我是Django的新手,请原谅我的无知:)

假设我有一个具有几个外键关系的模型,当我创建模型的实例时,我希望它也能自动为外键对象生成新的实例。在这种情况下,我将课程注册建模为一个组,并将特定的组作为模型上的外键引用。

class Course(models.Model):
    student_group = models.OneToOneField(Group, related_name="course_taken")
    teacher_group = models.OneToOneField(Group, related_name="course_taught")

    def clean(self):
        if self.id:
            try:
                self.student_group
            except Group.DoesNotExist:
                self.student_group, _ = Group.objects.get_or_create(name='_course_' + self.id + '_student')

            try:
                self.teacher_group
            except Group.DoesNotExist:
                self.teacher_group, _ = Group.objects.get_or_create(name='_course_' + self.id + '_teacher')

看来我可以使用模型的干净方法来执行此操作,但是我希望能够将整个事情包装在一个事务中,这样,如果以后无法创建课程,它就可以赢了。不要创建相关的Group对象。有什么办法可以做到这一点?

另外,我在这里完全是在做错事吗?Django是否提供更好的方法来做到这一点?

jin

最终我选择了:

from django.db import models, transaction
class Course(models.Model):
    student_group = models.OneToOneField(Group, related_name="course_taken")

    @transaction.commit_on_success
    def save(self, *args, **kwargs):
        if not self.student_group_id:
            self.student_group, _ = Group.objects.get_or_create(name='_course_' + self.id + '_student')

        super(Course, self).save(*args, **kwargs)

编辑(2014/12/01):@Shasanoglu是正确的,由于id尚不存在,因此上面的代码无法正常工作。调用save之后,您必须创建相关的对象(因此,您调用super.save,创建相关的对象,更新此对象,然后再次调用super.save -不理想。这就是您在组名中省略了ID的意思,美好的)。但最终,我将自动化相关对象的创建完全从模型中移出了。我用自定义表单的save方法完成了所有工作,该方法更加简洁,并放弃了在管理界面中使用此模型(这就是为什么我坚持要首先在model方法中进行所有这些操作的原因)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

django-需要在创建相关的forigenkey模型对象时创建模型对象

在Django模型中创建或更新另一个表的对象时自动创建模型对象

Django:创建模型时如何更新相关模型字段

使用相关对象中的数据创建模型实例

创建模型时自动装配的对象为空

在Django中创建模型

从views.py在数据库中创建模型对象时如何自动创建主键

Django-在创建另一个模型实例时自动创建模型实例

在 Django 中创建模型时获取“无法解包不可迭代的 int 对象”

在laravel中创建模型对象时,with()是什么?

创建模型对象时如何分配外键相关字段

在Django中创建模型实例

如何在由ManyToManyField创建的Django中创建模型的实例对象

Django - 创建用户时创建模型实例

在 Laravel 中获取与创建模型输入相关的错误

在模型中创建模型

django-filer上传会自动创建模型实例

Laravel5.3-创建模型时创建一定数量的相关模型

在Django中创建模型实例时,如何获取模型的长度

我可以在没有自动ID的Django中创建模型吗?

使用SQLAlchemy(Python)创建模型对象时生成GUID

Django模型表单对象的自动创建日期?

如何在Django视图中创建模型对象?

如何在 Django 中使用嵌套对象创建模型

创建模型实例时在Django中出现TypeError

创建模型实例时,Django会执行某些操作

在expressjs中创建模型

在Django中创建模型时,是否应考虑数据库规范化?

Django:创建其他模型时如何更新相关模型