2017-10-30 13 views
0

私はPerson、Role、Studentという3つのモデルを持っています。 PersonはManyToManyFieldでロールに関係し、StudentはPersonから継承します。コード:Djangoモデルセーブ関連モデル

class Person(models.Model): 
    #fields 

class Role(models.Model): 
    ROLE_CHOICES = (
     ('AL', 'ALUMNO'), 
     #... more choices 
    ) 
    person = models.ManyToManyField(Person) 
    role = models.CharField(
     'Rol', 
     max_length = 2, 
     choices = ROLE_CHOICES 
    ) 

class Student(Person): 
     # fields 

    def save(self, *args, **kwargs): 
     super(Student, self).save(*args, **kwargs) 

     # what code should I put here to save role? 

私は生徒を保存するときに自動的に彼( 'AL')の役割を保存します。また、それは作成時に更新されずに実行されなければなりません。

私はこれを追加する記事を見たことがありますが、これを実装するにはどうすればいいのかは分かりません。

私が理解しているように、saveメソッドを無効にすることはできますが、どのように正確に行うのかはわかりません。私はpost_saveシグナルもこれを達成できることを知っていますが、私はどちらもどちらか分かりません。

ありがとうございました。

答えて

2

m2m関係がインスタンスpkによって確立され、インスタンスがdbに保存された後にpkが生成されるため、学生がsaveメソッドでpkを取得する前にこれを行うことはできません。 2つのarchieveする方法:

まず1:

あなたのアプリで新しいsignals.pyファイル:

from django.db.models.signals import post_save 
from django.dispatch import receiver 

from .models import * 


@receiver(post_save, sender=Student) 
def create_student(sender, instance=None, created=False, **kwargs): 
    if created: 
     role, is_created = Role.objects.get_or_create(name='AL') 
     role.person.add(instance) 

とあなたのapps.py

class UserConfig(AppConfig): 
    name = 'user' 

    def ready(self): 
     import user.signals 

で独自app_labelUserを交換してください。

2つ目

ジャンゴ1.9後、Djangoはあなたがcommit.doc後にアクションを実行できるように、取引ツールを持っていることはhereです:

from django.db import transaction 

class Student(Person): 
    . 
    . 
    . 
    def save(self, *args, **kwargs): 
     instance = super(Student, self).save(*args, **kwargs) 
     if not self.pk: 
      # do when create 
      transaction.on_commit(self.update_role) 
     return instance 

    def update_role(self): 
     # this will be call after instance save to db 
     role, is_created = Role.objects.get_or_create(name='AL') 
     role.person.add(self) 

すべてのコードがテストされていません。

+0

ありがとうございます。人から継承した他のモデルにも複製したいので、信号を使用します。 –

関連する問題