Reputation: 117
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
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