Запросы, связанные с сигналами Django

#python #django #visual-studio-code

Вопрос:

Начнем с того, что Здесь Профиль и модель продавца создаются, когда модель пользователя создается с помощью Сигналов.Что я хочу сделать,так это при первом создании или обновлении модели профиля, я хочу, чтобы все поля модели продавца были такими же, как и все поля профиля.Аналогично,когда я впервые создал модель продавца,я также хочу, чтобы все поля модели профиля были такими же, как у модели продавца.Но я не мог понять, как это сделать?

 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)
         
 ...
 

Ответ №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()      
 

Также обратите внимание , что, если вы не определили related_name в своем OneToOneField , Django будет использовать имя модели в нижнем регистре для доступа к связанному объекту. Значит, instance.user.seller должно сработать.

Комментарии:

1. Это вообще не работает, вместо этого выдает мне ошибки. Но хорошо, что вы подали мне идею, и я ее разгадал.

2. запрос не может быть выполнен должен быть экземпляром пользователя