【问题标题】:Signal post_save in Django and modelsDjango 和模型中的信号 post_save
【发布时间】:2017-09-20 16:07:08
【问题描述】:

我有信号功能:

@receiver(post_save, sender=Task)
def my_handler():
    executor = User.objects.filter(user_type='Executer')
    executor.balance += Task.money
    executor.save()

添加任务后,我的函数应该向执行者添加资金。但它给出了如下错误:

Internal Server Error: /api/v1/tasks/
Traceback (most recent call last):
  ...
  File "/home/k/pro/freelance-django/free/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 1853, in get_prep_value
    return int(value)
ValueError: invalid literal for int() with base 10: 'Executer'
[20/Sep/2017 14:00:30] "POST /api/v1/tasks/ HTTP/1.1" 500 188088

用户类如下:

   from __future__ import unicode_literals

from django.db import models
from django.contrib.auth.models import AbstractUser


class User(AbstractUser):
    CUSTOMER = 1
    EXECUTER = 2

    USER_TYPES = (
        (CUSTOMER, 'Customer'),
        (EXECUTER, 'Executer'),
    )

    user_type = models.IntegerField(choices=USER_TYPES, default=EXECUTER, verbose_name='Тип пользователя')
    balance = models.DecimalField(decimal_places=2, max_digits=7, default=0, verbose_name='Баланс')


    def __str__(self):
        return self.username
task.models 中的

任务类是:

class Task(models.Model):
    title = models.CharField(max_length=255, verbose_name='Заголовок')
    description = models.CharField(max_length=255, verbose_name='Описание')
    money = models.DecimalField(max_digits=7, decimal_places=2, default=0, verbose_name='Цена')
    assignee = models.ForeignKey('users.User', related_name='assignee', null=True, verbose_name='Исполнитель')
    created_by = models.ForeignKey('users.User', related_name='created_by', verbose_name='Кем был создан')

我应该如何让它工作?

【问题讨论】:

  • 显示任务模型
  • 你能添加完整的用户模型类吗?

标签: django signals models


【解决方案1】:

你没有一个 object 而是 objects,所以你需要在它们上加上文字或使用 update()。最好的选择是使用性能良好的 F 表达式,因为它在 DB 上执行:

from django.db.models import F    

@receiver(post_save, sender=Task)
def my_handler(sender, instance, **kwargs):
    User.objects.filter(user_type=User.EXECUTER).update(balance=F('balance') + instance.money)

这会更新 user_type 为 Executer 的所有记录,并在一个查询中更新它们的余额。

Django docs update

F expressions

您的 user_type 字段是 IntegerField 并且在您的选择中您有字符串值,因此您需要将其更改为如下内容:

class User(AbstractUser):
    CUSTOMER = 1
    EXECUTER = 2

    USER_TYPES = (
        (CUSTOMER, 'Customer'),
        (EXECUTER, 'Executer'),
    )

    user_type = models.IntegerField(choices=USER_TYPES, default=EXECUTER, verbose_name='Тип пользователя')
    balance = models.DecimalField(decimal_places=2, max_digits=7, default=0, verbose_name='Баланс')

【讨论】:

  • 谢谢,但是这个解决方案给出了“invalid literal for int() with base 10: 'Executer'”错误
  • 我同意,但不幸的是它仍然会出错,这就是我尝试所有解决方案的原因。 " return int(value) ValueError: int() 以 10 为底的无效文字:'Executer' [20/Sep/2017 14:56:29] "POST /api/v1/tasks/ HTTP/1.1" 500 188228"
  • 我添加了你的代码,但同样的错误。唯一不同的是 User 继承自 AbstractUser
  • 将 user_type 过滤器更改为:user_type=User.EXECUTER
  • 新错误))) progress)) (1292, "截断不正确的 DOUBLE 值:''")
猜你喜欢
  • 2016-05-04
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
  • 2014-05-23
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
相关资源
最近更新 更多