Django模型:访问表之间的多级链接

2024-09-27 23:17:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我在访问模型中的某些数据时遇到问题

我有一个User模型,它把它的id给了一个Profile模型,这个id模型把它的ProfileA给了一个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)

我想做的是当一个Profile被创建时,当一个Useris_a==True时,创建一个ProfileA

这是我的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时:

{
    "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我不懂

我做错了什么

谢谢你的回复


Tags: djangonamefrom模型importselftruemodel
1条回答
网友
1楼 · 发布于 2024-09-27 23:17:32

create_profile_a函数的instance参数是profile的实例,可以轻松地指向用户并进一步获得目标属性is_a

profilea_模型中的接收器部件应更改为:

@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)

相关问题 更多 >

    热门问题