我是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是否提供更好的方法来做到这一点?
最终我选择了:
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] 删除。
我来说两句