首页 > 解决方案 > AttributeError:“NoneType”对象没有属性“保存”django

问题描述

我有三个模型。当我创建一个User时,它会创建一个UserProfile. 创建 UserProfile后它应该创建一个Artist. 一切正常,但是当我更新时UserProfile发生错误。

models.py

class Artist(models.Model):
      CHOICES = (
             (0, 'celebrities'),
             (1, 'singer'),
             (2, 'comedian'),
             (3, 'dancer'),
             (4, 'model'),
             (5, 'Photographer')
               )


      name = models.CharField(max_length=100,null= True)
      artist_category = models.IntegerField(choices = CHOICES, null=True)
      artist_image = models.ImageField(upload_to= 'media',null=True)
      bio = models.TextField(max_length = 500)

      def __str__(self):
          return str(self.name)

class UserProfile(models.Model):
      CHOICES = (
            (0, 'celebrities'),
            (1, 'singer'),
            (2, 'comedian'),
            (3, 'dancer'),
            (4, 'model'),
            (5, 'Photographer')
         )
      user = models.OneToOneField(CustomUser, related_name='userprofile', on_delete= models.CASCADE)
      artist = models.ForeignKey(Artist,related_name='userprofile', on_delete=models.CASCADE, null=True)

      name = models.CharField(max_length=100, null=True)
      artist_category = models.IntegerField(choices= CHOICES, null=True)
      mobile_number = PhoneNumberField(null=True)
      country = CountryField(default = 'IN')
      city = models.CharField(blank=True, max_length=100)
      bio = models.TextField(blank=True)

      def __str__(self):
          return str(self.user)

def create_profile(sender,instance, created,**kwargs):
    if created:
       data = {
            'name': instance.name
              }

    UserProfile.objects.create(user=instance,**data)
post_save.connect(create_profile,sender=CustomUser)

@receiver(post_save, sender= CustomUser)
def save_profile(sender,instance,**kwargs):
    instance.userprofile.save()


def create_artist(sender,instance,created,**kwargs):
    if created:
       data = {
           'name': instance.name,
           'artist_category': instance.artist_category,
           'bio': instance.bio
           }
       Artist.objects.create(**data)        

   post_save.connect(create_artist,sender=UserProfile)

@receiver(post_save, sender= UserProfile)
def save_artist(sender,instance,**kwargs):
    instance.artist.save()

它给了我这个错误:

`File "/home/tboss/Desktop/environment/celeb/celeb/main_site/models.py", line 155, in create_artist
instance.artist.save()
AttributeError: 'NoneType' object has no attribute 'save'

`................................................. …………

标签: djangopython-3.x

解决方案


问题是,在您的第一个 post_save信号中UserProfile,您正在创建一个新Artist实例,但没有将它与您的UserProfile实例连接起来。

删除create_artistandsave_artist信号并添加以下内容:

@receiver(post_save, sender= UserProfile)
def update_artist(sender,instance,created,**kwargs):
    if created:
       data = {
           'name': instance.name,
           'artist_category': instance.artist_category,
           'bio': instance.bio
           }
       instance.artist = Artist.objects.create(**data)
       instance.save()
    else:
        instance.artist.save()

同一模型有两个 post_save信号,可以合并为一个。


推荐阅读