【问题标题】:Queries related to Django Signals与 Django 信号相关的查询
【发布时间】:2021-09-09 14:51:49
【问题描述】:

首先,当通过 Signals 创建用户模型时,会创建 Profile 和 Seller 模型。我想要做的是当第一次创建或更新配置文件模型时,我希望 Seller 模型的所有字段与Profile的所有字段。和我第一次创建Seller模型时一样,我也希望Profile Model的所有字段都与Seller模型的字段相同。但是,我不知道该怎么做?

from typing import Tuple
from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse
from django.db.models.fields import DecimalField
from django.dispatch import receiver
from django.db.models.signals import post_save

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True) #cascade is for deleting the customer
    first_name = models.CharField(max_length=10, null=True)
    second_name=models.CharField(max_length=10,null=True)
    email = models.EmailField(max_length=70, null=True,blank=True)


@receiver(post_save, sender=User)
def create_profile(sender, instance,created,**kwargs):#Signal receivers must accept keyword arguments (**kwargs).
    if created:
        Profile.objects.create(user=instance)
    ...

@receiver(post_save, sender=Profile)
def create_seller(sender, instance,created,**kwargs):#Signal receivers must accept keyword arguments (**kwargs).
    if created:
        Seller.objects.create(user=instance)

class Seller(models.Model):
    user = models.OneToOneField(Profile, on_delete=models.CASCADE, null=True, blank=True) #cascade is for deleting the customer
    first_name = models.CharField(max_length=10, null=True)
    second_name=models.CharField(max_length=10,null=True)
    email = models.EmailField(max_length=70, null=True,blank=True)
         
 ...

【问题讨论】:

    标签: python django visual-studio-code


    【解决方案1】:

    如果created=True 表示创建了Profile 对象。否则如果created=False 表示Profile 对象已更新。

    created=True 需要创建Seller 对象,created=False 需要更新Seller 对象。

    你可以这样做:

    @receiver(post_save, sender=Profile)
    def update_or_create_seller(sender, instance, created, **kwargs):
        if created:
            Seller.objects.create(
                user=instance.user, 
                first_name=instance.first_name,
                second_name=instance.second_name,
                email=instance.email
            )
        else:
            seller = instance.user.seller
            seller.first_name = instance.first_name
            seller.last_name = instance.second_name
            seller.email = instance.email
            seller.save()      
    

    另外请注意,除非您在 OneToOneField 中定义 related_name,否则 Django 将使用 小写 模型名称来访问相关对象。所以,instance.user.seller 应该可以工作。

    【讨论】:

    • 它根本不起作用,反而给了我错误。但是你给了我想法,我解决了。
    • 不能查询必须是用户实例
    猜你喜欢
    • 2020-08-07
    • 2014-09-04
    • 2018-09-22
    • 2018-10-14
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多