python - Django 模型:访问表之间的多级链接
问题描述
我在访问模型中的某些数据时遇到问题。
我有一个User
模型将其id
提供给Profile
模型,该模型将其提供id
给ProfileA
模型。
当我创建一个时User
,它会自动创建一个Profile
.
这是我的user_model
from django.db import models
from django.contrib.auth.models import AbstractUser
from django_countries.fields import CountryField
from .model_custom_user_manager import CustomUserManager
class User(AbstractUser):
"""auth/login-related fields"""
is_a = models.BooleanField('a status', default=False)
is_e = models.BooleanField('e status', default=False)
# objects = CustomUserManager()
def __str__(self):
return "{} {}".format(self.first_name, self.last_name)
我的profile_model
:
from django.db import models
from django_countries.fields import CountryField
from django.contrib.auth import get_user_model
User = get_user_model()
from django.db.models.signals import post_save
from django.dispatch import receiver
class Profile(models.Model):
"""non-auth-related/cosmetic fields"""
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
birth_date = models.DateTimeField(auto_now=False, auto_now_add=False, null=True)
nationality = CountryField(null=True)
def __str__(self):
return f'{self.user.username} Profile'
"""receivers to add a Profile for newly created users"""
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
而我想要做的是创建 aProfileA
时创建 aProfile
和时 a User
has is_a==True
。
这是我的profilea_model
:
from django.db import models
from .model_profile import *
from django.db.models.signals import post_save
from django.dispatch import receiver
class ProfileA(models.Model):
profile = models.ForeignKey(Profile, null=True, on_delete=models.CASCADE, related_name='profile_a')
biography = models.CharField(max_length=200, null=True)
def __str__(self):
return "{}".format(self.profile)
@receiver(post_save, sender=Profile)
def create_profile_profile_a(sender, instance, created, **kwargs):
if created & Profile.user.is_a == True:
ProfileA.objects.create(profile=instance)
当我尝试User
使用 Postman 创建一个时:
{
"username":"Pepe",
"password":"Yolo1234",
"first_name":"Pepe",
"last_name":"Pepito",
"email":"pepe@yolo.com",
"is_a":true,
"is_e":false
}
我得到错误:
AttributeError at /users/
'ForwardOneToOneDescriptor' object has no attribute 'is_a'
我尝试了很多东西,但没有任何东西可以使用我无法理解的 DjangDocs。
我究竟做错了什么?
感谢您的回复!
解决方案
create_profile_profile_a函数的实例参数是 Profile 的实例,可以很容易地指向 User 并进一步获取目标属性is_a。
profilea_model 中的接收器部分应更改为:
@receiver(post_save, sender=Profile)
def create_profile_profile_a(sender, instance, created, **kwargs):
if created & instance.user.is_a == True:
ProfileA.objects.create(profile=instance)