首页 > 解决方案 > Django 模型:访问表之间的多级链接

问题描述

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

我有一个User模型将其id提供给Profile模型,该模型将其提供idProfileA模型。

当我创建一个时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 Userhas 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。

我究竟做错了什么?

感谢您的回复!

标签: pythondjangoforeign-keys

解决方案


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)

推荐阅读