Django модели: доступ к многоуровневой связи между таблицами - PullRequest
1 голос
/ 01 мая 2020

У меня проблема с доступом к определенным данным в моих моделях.

У меня есть модель 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)

И что я пытаюсь сделать, это создать ProfileA, когда создается Profile И когда User имеет 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 с почтальоном:

{
    "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'

I Я перепробовал много вещей, но ничего не проснулось, и с помощью DjangDocs я не могу понять.

Что я делаю не так?

Спасибо за ваши ответы!

1 Ответ

1 голос
/ 01 мая 2020

Аргумент instance функции create_profile_profile_a является экземпляром профиля, который можно легко указать пользователю и получить дополнительный целевой атрибут 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...