Python 如何在创建模型实例时创建特殊函数?
我正在制作一个系统,当用户创建一个日志时,他会从如何创建日志中获得分数。我该怎么做才能做到这一点呢?我尝试创建一个signal.py函数,但它给了我一个错误“DPRLog”对象没有属性“Points”。我做得对吗?我只想在创建日志时添加点,所以我将其作为signal.py类放置。有人能帮我吗?谢谢 这是我的models.py:Python 如何在创建模型实例时创建特殊函数?,python,django,django-models,Python,Django,Django Models,我正在制作一个系统,当用户创建一个日志时,他会从如何创建日志中获得分数。我该怎么做才能做到这一点呢?我尝试创建一个signal.py函数,但它给了我一个错误“DPRLog”对象没有属性“Points”。我做得对吗?我只想在创建日志时添加点,所以我将其作为signal.py类放置。有人能帮我吗?谢谢 这是我的models.py: from django.db import models from profiles.models import User from django.urls import
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
DPRLog
表上没有点
字段。我猜您想通过DPRLog->User>points
增加points
模型上的字段,因此,除非您在一对一字段中定义相关的\u名称,否则ORM将使用小写的模型名称访问相关对象:
instance.testuser.points.points +=1
instance.testuser.points.save()
所以我必须为DPRLog中的点添加一个OTM?我只想像你说的那样访问它。我的问题是,当我执行a.save()时,它会创建另一个points实例吗?或者只是将其添加到现有实例上?嘿,它可以工作,谢谢,但当我添加.save()时,它会给我一个错误,即“int”对象没有属性“save”,我想知道模型是否已更改?您可以简单地做一点-将相关的\u name
参数添加到Points
modeluser
字段中,然后您就可以以更简单的方式写回引用,比如instance.testuser.user\u Points.save()
我将其更改为:(instance.testuser.points.points+=1 instance.testuser.points.save())
'code'