I have this model in the Database:
products_package with a
I want to create an auto-incremental Code using this
PCKG string plus the record id.
That is, if I create record 25 it should look like this:
Below I created more or less a function so that you understand what I want to do:
- Get the registry
- Get the code
- update the field
I'm pretty new to Python and Django so something is not right in the
Summarizing: I want to create an autoincremental code taking into account the
string + the
from django.db import models class products_package(models.Model): __AUTOCODE__ = 'PCKG' code = models.CharField(verbose_name="Code", max_length=10, unique=True) description = models.TextField(null=True, blank=True, verbose_name="Description") pieces = models.FloatField(verbose_name="Pieces") product_id = models.ForeignKey( products, verbose_name="Product", on_delete=models.CASCADE) location_id = models.ForeignKey( stock_location, verbose_name="Location", null=True, blank=True, on_delete=models.CASCADE) def __str__(self): return self.code def get_auto_code(self, **kwargs): code = super(products_package, self).get_auto_code(**kwargs) code_str = str(self.__AUTOCODE__ + self.id) code = self.code = code_str return code
Stay tuned to your comments.
First we create our signal (ideally, the
__AUTOCODE__ attribute should not have underscores, since you imply that it is a special attribute and it is not, better is
AUTOCODE , without further ado):
from django.db.models.signals import post_save from django.dispatch import receiver @receiver(post_save, sender = 'my_app.products_package') def set_auto_code(sender, instance, **kwargs): if kwargs.get('created'): # Entramos al if si se ha creado la instancia # Actualisamos la instancia sender.objects.filter(id = instance.id).update(code = instance.AUTOCODE + str(instance.id))
You can put this signal in your
models.py file or in a file called
signals.py , but if you want to put it in this one, you will have to make some modifications in some files, but that is another topic.
This way every time an instance is created this signal will be called and will update the
code field. So the value of the
code field will always be
'PCKG' + id .
(A short explanation of What are signals in Django?, since a signal is a trigger that is automatically called after an event that occurs in the ORM or in the db, for more information visit the Django documentation )
On the other hand, if you only want to "show" the
AUTOCODE + id so to speak, simply create a function that returns it (because the signal is somewhat tedious and unnecessary if you are only going to show it in a template or something like that):
class products_package(models.Model): AUTOCODE = 'PCKG' ... def get_autocode(self): return self.AUTOCODE + str(self.id)
It will suffice to do the following to obtain the
>>> instance.get_autocode() PCKG25
And that would be all, I hope I have helped you.