2015-09-02 155 views
0

上午有两个模型类用户和帐户通过一起链接或通过称为useraccounts的另一个表连接。Django模型外键自动填充

我想要的是useraccounts表会自动填充用户和帐户表的ID,当我向他们(用户和帐户)提交数据时。

这里是我的示例模型代码。 Error page

class Account(models.Model): 
    # fields 
    id = models.IntegerField(primary_key=True) 
    t_stamp = models.DateField(default=datetime.datetime.now()) 
    acctno = models.TextField(null=False, unique =True) 
    acctname = models.TextField(null=False) 
    status = models.TextField(null=False, choices=STATUS) 
    accttype = models.TextField(null=False,choices=ACCT_TYPE) 
    acctclass = models.TextField(null=False, choices=ACCT_CLASS) 
    min_balance = models.FloatField(default=0) 
    cur_balance = models.FloatField(default=0) 
    ava_balance = models.FloatField(default=0) 
    #fundingsources = models.ManyToManyField(FundingSource) 
    class Meta: 
     managed = False 
     db_table = 'accounts' 

    def save(self, *args, **kwargs): 
     super(Account, self).save(*args, **kwargs) 
     try: 
      self.useraccount_set.all()[0] 
     except: 
      UserAccount.objects.bulk_create([UserAccount(account_id=self,user_id=user) for user in User.objects.all()]) 

    class User(AbstractBaseUser, PermissionsMixin): 
    id  = models.AutoField(primary_key=True) 
    username = models.TextField(unique=True, null=True) 
    fullname = models.TextField(null=False) 
    country = models.TextField(null=True) 
    email = models.EmailField(unique=True, db_index=True) 
    phone = models.TextField() 
    address = models.TextField() 
    activation_key = models.CharField(max_length=40) 
    key_expires = models.DateTimeField(null=True) 
    date_joined = models.DateTimeField(default=timezone.now) 
    is_active = models.BooleanField(default=True) 
    is_admin = models.BooleanField(default=True) 
    #accounts = models.ManyToManyField(Account, through='UserAccount') 


    class Meta: 
     db_table = "users" 


    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['username'] 
    objects = UserManager() 


    def get_short_name(self): 
    return self.fullname 


    def get_username(self): 
    return self.email 

    def is_authenticated(self): 
     return True 

    @property 
    def is_staff(self): 
     "Is the user a member of staff?" 
     # Simplest possible answer: All admins are staff 
     return self.is_admin  



signals.post_save.connect(create_auth_client, sender=User) 
User._meta.get_field_by_name('email')[0]._unique=True 


    class UserAccount(models.Model): 
    user_id = models.ForeignKey(User) 
    account_id = models.ForeignKey(Account) 

    class Meta: 
     managed = False 
     db_table = 'useraccounts' 


class UserAccount(models.Model): 
    user_id = models.ForeignKey(User) 
    account_id = models.ForeignKey(Account) 

class Meta: 
    managed = False 
    db_table = 'useraccounts' 
+0

你不能做到这一点。您可以编写一个函数来填充UserAccount类,并在您每次向表中提交数据时调用它。但我认为你需要扩展自定义用户模型,[使用文档](https://docs.djangoproject.com/en/1.8/topics/auth/customizing/#extending-the-existing-user-model)。每个用户有一个帐户?然后'OneToOneFields'就是你正在寻找的东西。 – Dracontis

回答

0

你所要做的是,在模型中保存方法:

class Account(models.Model): 

    id = models.IntegerField(primary_key=True) 

    def save(self, *args, **kwargs): 
     super(Account, self).save(*args, **kwargs) 
     try: 
      self.useraccount_set.all()[0] 
     except: 
      UserAccount.objects.bulk_create([UserAccount(account_id=self,user_id=user) for user in User.objects.all()]) 




class User(AbstractBaseUser, PermissionsMixin): 
    id = models.AutoField(primary_key=True) 
    def save(self, *args, **kwargs): 
     super(User, self).save(*args, **kwargs) 
     try: 
      self.useraccount_set.all()[0] 
     except: 
      UserAccount.objects.bulk_create([UserAccount(user_id=self,account_id=account) for account in Account.objects.all()]) 
+0

我在这行“UserAccount.objects.bulk_create(UserAccount(user_id = self,account_id = account)Account.objects.all()]中获得编程错误) ” –

+0

你能发布错误吗? –

+0

异常类型:\t ProgrammingError 异常值:\t 列accounts.min_balance不存在 –