JustADudeTryingToCode
JustADudeTryingToCode

Reputation: 117

All models reset when creating a new one in django

My goal is to generate a random joinkey for every new model based on a function that takes the models own primary key as an argument.

The problem is that every time I create a new object the joinkey field resets for every single object in my database, which I do not want, I would only like the joinkey to be added to the new object being created.

This is my model:

class Project(MainAbstractModel):
    users = models.ManyToManyField(User)
    title = models.CharField(max_length=25, default="")

    @property
    def joinkey(self):
        return random_int(self.pk)
    @joinkey.setter
    def joinkey(self, value):
        joinkey = models.IntegerField(null=True, unique=True)

    def other_user(self):
        return self.users.exclude(username=user.username)

and here is the random_int function just in case:

def random_int(primarykey):
    return int(randint(10000, 99999) + 1000000 + primarykey)

Upvotes: 0

Views: 38

Answers (1)

isAif
isAif

Reputation: 2344

You can use signals to add values to a field whenever a new object is created.

class Project(MainAbstractModel):
    users = models.ManyToManyField(User)
    title = models.CharField(max_length=25, default="")
    joinkey = models.IntegerField(null=True, unique=True)


    # Remove all this, from here
    @property
    def joinkey(self):
        return random_int(self.pk)
    @joinkey.setter
    def joinkey(self, value):
    # till here

Create a new file in same directory as models.py named 'signals.py'

signals.py

from django.db.models.signals import post_save
from django.dispatch import receiver
# import the random_int method

@receiver(post_save, sender=Project)
def create_joinkey(sender, instance, created, **kwargs):
    """Create a joinkey whenever a project object is created."""
    if created: 
        instance.joinkey = random_int(instance.id)
        instance.save()

apps.py

from django.apps import AppConfig


class YourAppConfig(AppConfig):
    name = 'yourapp'

    # Add this to use signals
    def ready(self):
        from . import signals

Upvotes: 1

Related Questions