Search code examples
djangodjango-rest-frameworksignals

Signal Problem in creating instance of my model


please help I have a problem I'm trying to write a signal in my code when the user registers, create a portfolio and profile for the user, it can create a user and profile and portfolio correctly but when I want to create a market in admin(because only admin can create a market, not user) I got an error from my signal this line('instance.Portfolio.save()'),
My Signal


    @receiver(post_save, sender=User)
def create_user_portfolio(sender, instance, created, **kwargs):
    if created:
        Portfolio.objects.create(user=instance)


@receiver(post_save, sender=Market)
def save_user_portfolio(sender, instance, **kwargs):
    instance.Portfolio.save(market=instance)

And it is my portfolio model


    class Portfolio(models.Model):
    name = models.CharField(max_length=50, blank=False, null=True, default='portfolio')
    user = models.ForeignKey('accounts.User', on_delete=models.DO_NOTHING, related_name='investor')
    assets = models.ManyToManyField(Assets, related_name='assets')

My user model

class User(AbstractBaseUser, PermissionsMixin):
    username = models.CharField(max_length=255)
    email = models.EmailField(max_length=255, unique=True, db_index=True)
    is_verified = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_author = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    auth_provider = models.CharField(
        max_length=255, blank=False,
        null=False, default=AUTH_PROVIDERS.get('email'))

I have to say my portfolio and user are in a different app
And it's my market model maybe you need it


    class Market(models.Model):
    name = models.CharField(max_length=50, unique=True, blank=False, null=False)
    currency = models.CharField(max_length=25, blank=False, null=False)

My error is: 'Market' object has no attribute 'Portfolio'


Solution

  • My problem was solved by the below code,

    I needed to disconnect the signal before saving, then connect again

        def post_save_product(sender, instance, **kwargs):
        post_save.disconnect(post_save_product, sender=sender)
        instance.save()
        post_save.connect(post_save_product, sender=sender)
    post_save.connect(post_save_product, sender= Market)