0

I want to run my function to do something in a request to url of serializer

my serializer :

class usersSerializer(ModelSerializer):
    class Meta:
        model=users
        fields="__all__"    

my view for serializer:

class usersCreate(generics.CreateAPIView):
    queryset=users.objects.all()
    serializer_class=usersSerializer

my function:

def f():
    now=datetime.now()
    now10=now + timedelta(minutes = 10)
    quer=users.objects.last()
    rcode=randint(1000,9999)
    a=SMS(users_id=quer,code=rcode,expireTime=now10)
    a.save()

SMS is another table users_id ====> foreigne key to id in users table

I want to when I send request to user create url changed two table : users SMS

models:

class users(models.Model):
    number=models.CharField(verbose_name="userNumber",max_length=11)
    name=models.CharField(verbose_name="name",max_length=40)
    createTime=models.DateTimeField( auto_now_add=True,auto_now=False)
    status=models.BooleanField(default=False)

class SMS(models.Model):
    users_id=models.ForeignKey(users,on_delete=models.CASCADE,default=0)
    code=models.PositiveSmallIntegerField(verbose_name="randomCode")
    expireTime=models.DateTimeField()
    status=models.BooleanField(default=False)
Mr Singh
  • 3,936
  • 5
  • 41
  • 60
mohamadrezach
  • 25
  • 1
  • 7

3 Answers3

2

On models.py you can use signals. Which is safer then assuming the LAST will return the current user for an SMS message.

from django.db.models.signals import post_save,pre_save

@receiver(post_save, sender=users)
def post_save_users(sender, instance, created, **kwargs):
    if created:
        now=datetime.now()
        now10=now + timedelta(minutes = 10)
        quer=users.objects.last()
        rcode=randint(1000,9999)
        sms = SMS(user_id=instance,code=rcode,expireTime=now10)
        sms.save()
    instance.save()
Walucas
  • 2,549
  • 1
  • 21
  • 44
1

You can overwrite CreateAPIView's create method. Call f after model is created.

class usersCreate(generics.CreateAPIView):
    queryset=users.objects.all()
    serializer_class=usersSerializer

    def create(self, request, *args, **kwargs):
        r = super(usersCreate, self).create(request, *args, **kwargs)
        f()
        return r
Fabricator
  • 12,722
  • 2
  • 27
  • 40
0
@receiver(post_save,sender=users)
def post_save_users(sender, instance, created, **kwargs):
    if created:
        now=datetime.now()
        now10=now + timedelta(minutes = 10)
        quer=users.objects.last()
        rcode=randint(1000,9999)
        a=SMS(users_id=instance,code=rcode,expireTime=now10)
        a.save()
mohamadrezach
  • 25
  • 1
  • 7