相关疑难解决方法(0)

Django post_save()信号实现

我有一个关于django的问题.

我在这里有ManyToMany模型

class Product(models.Model):
     name = models.CharField(max_length=255)
     price = models.DecimalField(default=0.0, max_digits=9, decimal_places=2)
     stock = models.IntegerField(default=0)

     def  __unicode__(self):
         return self.name

class Cart(models.Model):
    customer = models.ForeignKey(Customer)
    products = models.ManyToManyField(Product, through='TransactionDetail')
    t_date = models.DateField(default=datetime.now())
    t_sum = models.FloatField(default=0.0)

    def __unicode__(self):
         return str(self.id)

class TransactionDetail(models.Model):
    product = models.ForeignKey(Product)
    cart = models.ForeignKey(Cart)
    amount = models.IntegerField(default=0)
Run Code Online (Sandbox Code Playgroud)

对于创建的1个购物车对象,我可以插入尽可能多的新TransactionDetail对象(产品和金额).我的问题是.我该如何实现触发器?我想要的是每当创建交易细节时,我希望产品库存的数量减去transactiondetail中的金额.

我读过有关post_save()但我不确定如何实现它.也许这样的事情

when:post_save(TransactionDetail,Cart)#Cart对象,其中TransactionDetail.cart = Cart.id

post_save(TransactionDetail, 
       Cart) #Cart object where TransactionDetail.cart= Cart.id
Cart.stock -= TransactionDetail.amount
Run Code Online (Sandbox Code Playgroud)

python django django-signals django-models

61
推荐指数
4
解决办法
7万
查看次数

创建扩展用户配置文件

我在django中有一个扩展的UserProfile模型:

class UserProfile(models.Model):
  user = models.ForeignKey(User, unique=True)
  #other things in that profile
Run Code Online (Sandbox Code Playgroud)

还有一个signals.py:

from registration.signals import user_registered
from models import UserProfile
from django.contrib.auth.models import User

def createUserProfile(sender, instance, **kwargs):
  profile = users.models.UserProfile()
  profile.setUser(sender)
  profile.save()

user_registered.connect(createUserProfile, sender=User)
Run Code Online (Sandbox Code Playgroud)

我确保信号通过以下方式注册__init__.py:

import signals
Run Code Online (Sandbox Code Playgroud)

那么应该为每个注册的用户创建一个新的UserProfile,对吧?但事实并非如此.我尝试登录时总是得到"UserProfile匹配查询不存在"错误,这意味着数据库条目不存在.

我应该说我使用django-registration,它提供user_registered信号.

重要应用程序的结构是,我有一个名为"users"的应用程序,我有:models.py,signals.py,urls.py和views.py(以及其他一些在这里无关紧要的事情) ).UserProfile类在models.py中定义.

更新:我将signals.py更改为:

from django.db.models.signals import post_save
from models import UserProfile
from django.contrib.auth.models import User

def create_profile(sender, **kw):
    user = kw["instance"]
    if kw["created"]:
        profile = UserProfile()
        profile.user = user
        profile.save()

post_save.connect(create_profile, sender=User)
Run Code Online (Sandbox Code Playgroud)

但现在我得到了"IntegrityError":

"列user_id不是唯一的"

编辑2:

我找到了.看起来我以某种方式注册了两次信号.此处描述了解决方法: …

django django-registration

46
推荐指数
4
解决办法
2万
查看次数

django-registration自动创建UserProfile

我正在使用django-registration,我正在尝试连接其信号以自动创建UserProfile.

信号定义:

from django.dispatch import Signal

# A new user has registered.
user_registered = Signal(providing_args=["user", "request"])
Run Code Online (Sandbox Code Playgroud)

信号由django-registration发送:

    def register(self, request, **kwargs):
    """
    Create and immediately log in a new user.

    """
    username, email, password = kwargs['username'], kwargs['email'], kwargs['password1']
    User.objects.create_user(username, email, password)

    # authenticate() always has to be called before login(), and
    # will return the user we just created.
    new_user = authenticate(username=username, password=password)
    login(request, new_user)
    signals.user_registered.send(sender=self.__class__,
                                 user=new_user,
                                 request=request)
    return new_user
Run Code Online (Sandbox Code Playgroud)

我的信号连接:

from registration.signals import *
from core.models import UserProfile
from …
Run Code Online (Sandbox Code Playgroud)

django profile django-registration

9
推荐指数
1
解决办法
4131
查看次数