#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. запрос не может быть выполнен должен быть экземпляром пользователя