Как создать специальную функцию при создании экземпляра модели? - PullRequest
0 голосов
/ 27 марта 2020

Я создаю систему, в которой, когда пользователь создает журнал, он получает очки от того, как он. Как я go пытаюсь это сделать? Я попытался создать функцию signal.py, но она выдает ошибку «объект DPRLog» не имеет атрибута «Точки». Я делаю это правильно? Я просто хочу добавлять точки каждый раз, когда я создаю журнал, поэтому я поместил его как класс signal.py. Может кто-нибудь мне помочь? Спасибо

Вот мои модели.py:

from django.db import models
from profiles.models import User
from django.urls import reverse



# Create your models here.

class Points(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    points = models.IntegerField(default=0, null=False)

    def __str__(self):
        return self.user.username


class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    image = models.ImageField(default='default.png', upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username} Profile'


class Manager(models.Model):
    manager = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return self.manager.full_name


class Member(models.Model):
    manager = models.ForeignKey(Manager, on_delete=models.CASCADE)
    member = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=30, null=True)

    def __str__(self):
        return self.member.full_name


class Job(models.Model):
    manager = models.ForeignKey(Manager, on_delete=models.CASCADE)
    member = models.ForeignKey(Member, on_delete=models.CASCADE)
    title = models.CharField(max_length=30, blank=False, null=False)
    description = models.TextField()
    datePosted = models.DateTimeField(auto_now=True)
    file = models.FileField(null=True, blank=True, upload_to='job_files')

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('job-detail', kwargs={'pk': self.pk})

class DPRLog(models.Model):
    STATUS_CHOICES = (

        ('PENDING', 'PENDING'),
        ('CANCELLED', 'CANCELLED'),
        ('COMPLETED', 'COMPLETED'),


        )
    TASKS_CHOICES = (
        ('TESTS EXECUTION', 'TESTS EXECUTION'),
        ('TESTS DESIGN', 'TESTS DESIGN'),
        ('MOBILE TESTING WORKSHOP', 'MOBILE TESTING WORKSHOP'),
        ('BENCH ACTIVITY', 'BENCH ACTIVITY'),
        ('DEFECT ANALYSIS','DEFECT ANALYSIS'),
    )




    testuser = models.ForeignKey(User,on_delete = models.CASCADE,unique_for_date= 'reportDate')
    status = models.CharField(max_length=30, choices=STATUS_CHOICES,null=True)
    reportDate = models.DateField(blank=False, null=False)
    login = models.TimeField(blank=False, null=False)
    logout = models.TimeField(blank=False, null=False)
    totalHours = models.DecimalField(max_digits=4,decimal_places=2,null=True)
    OTHours = models.DecimalField(max_digits=4,decimal_places=2,null=True)
    mainTasks = models.CharField(max_length=50, blank=False, choices=TASKS_CHOICES, null=True)
    remarks = models.CharField(max_length=30,null=True)

    def __str__(self):
        return f'{self.testuser.full_name} DPR Log'

    @property
    def CalculateTotalHours(self):
        self.totalHours = self.logout.timeDelta - self.login.TimeDelta
        return self.TotalHours

    @property
    def OTHours(self):
        if self.totalHours > 9.00:
            self.OTHours = self.totalHours-9.00

И Signals.py:

@receiver(post_save, sender=DPRLog)
def add_point(sender, instance, created, **kwargs):
    instance.Points+=1

1 Ответ

1 голос
/ 27 марта 2020

В таблице DPRLog нет поля Points. Я предполагаю, что вы хотели увеличить поле points на Points модели до DPRLog -> User > Points, поэтому, если вы не укажете related_name в поле один-к-одному, ORM будет использовать имя модели в нижнем регистре для доступа к связанному объекту:

instance.testuser.points.points +=1
instance.testuser.points.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...