Ошибка атрибута с пользователем в приложении django
Я делаю приложение для клиники. Я нахожусь в финансовом разделе своего приложения. Я хочу получать доход через запись на прием. Когда я тестирую эту конечную точку в postman, я получаю следующую ошибку: AttributeError: Получена ошибка AttributeError при попытке получить значение для поля user
на сериализаторе UserInfoSerializer
.
Поле сериализатора может быть названо неверно и не соответствовать какому-либо атрибуту или ключу экземпляра User
.
Оригинальный текст исключения был: 'User' object has no attribute 'user'.
Я отправляю вам свои файлы, чтобы вы могли помочь мне, так как у меня была эта ошибка в течение нескольких дней без возможности решить ее.
userinfo/models.py
from django.db import models
from django.contrib.auth.models import User
class UserInfo(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="userInfo")
address = models.CharField(max_length=255, blank=True, null=True)
phone = models.CharField(max_length=15, blank=True, null=True)
fecha_nacimiento = models.DateField(blank=True, null=True)
dni = models.CharField(max_length=10, blank=True, null=True)
postal_code = models.CharField(max_length=6, blank=True, null=True)
city = models.CharField(max_length=200, blank=True, null=True)
country = models.CharField(max_length=100, blank=True, null=True)
segundo_apellido = models.CharField(max_length=200, blank=True)
def __str__(self):
return f"Información de {self.user.username}"`
Мой finanzas/models.py:
from django.db import models
from citas.models import Citas
from userinfo.models import UserInfo
class Transaccion(models.Model):
INGRESO = 'INGRESO'
GASTO = 'GASTO'
INGRESO_COTIZADO = 'INGRESO_COTIZADO'
TIPO_CHOICES = [
(INGRESO, 'Ingreso'),
(GASTO, 'Gasto'),
(INGRESO_COTIZADO, 'Ingreso_Cotizado')
]
tipo = models.CharField(
max_length=100,
choices=TIPO_CHOICES,
default=INGRESO,
)
monto = models.DecimalField(max_digits=10, decimal_places=2)
descripcion = models.TextField()
fecha = models.DateTimeField(auto_now_add=True)
cita = models.ForeignKey(Citas, on_delete=models.CASCADE) # Relacionado con la cita
user = models.ForeignKey(UserInfo, on_delete=models.CASCADE) # Relacionado con el usuario que cotiza
url = models.URLField(null=True, blank=True)
def __str__(self):
return f"Transacción de {self.tipo} por {self.monto} para la cita {self.cita}"
class ConfiguracionFinanzas(models.Model):
precio_cita_base = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name="Precio base de la cita")
ultima_actualizacion = models.DateTimeField(auto_now=True)
def __str__(self):
return f"Configuración de Finanzas (Precio Cita: {self.precio_cita_base})"
Мой views.py:
Мой serializers.py
from rest_framework import serializers
from django.db import models
from finanzas.models import Transaccion, ConfiguracionFinanzas
from citas.models import Citas
from userinfo.models import UserInfo
from patients.models import Patient
from django.contrib.auth.models import User
from rest_framework.exceptions import ValidationError
from datetime import datetime
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'first_name', 'last_name', 'user']
class UserInfoSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = UserInfo
fields = ['user', 'address', 'dni', 'postal_code', 'city', 'country', 'segundo_apellido']
def get_user(self, obj):
# Asegúrate de que el objeto user esté presente y se pase correctamente
return UserSerializer(obj.user).data if obj.user else None
class PatientSerializers(serializers.ModelSerializer):
class Meta:
model = Patient
fields = ['nombre', 'primer_apellido', 'segundo_apellido', 'dni', 'address', 'city', 'code_postal', 'country']
class CitaSerializers(serializers.ModelSerializer):
patient = PatientSerializers()
user = UserInfoSerializer()
class Meta:
model = Citas
fields = ['patient', 'fecha', 'descripcion', 'precio', 'cotizada', 'user']
def validate_precio(self, value):
if value < 0:
raise ValidationError("El precio de la cita no puede ser negativo.")
return value
def validate(self, data):
if data.get('fecha') > datetime.now():
raise ValidationError("La fecha de la cita no puede ser en el futuro.")
return data
class ConfiguracionFinanzasSerializer(serializers.ModelSerializer):
class Meta:
model = ConfiguracionFinanzas
fields = ['id', 'precio_cita_base', 'ultima_actualizacion']
def validate_precio_cita_base(self, value):
if value < 0:
raise ValidationError("El precio base de la cita no puede ser negativo.")
return value
class TransaccionSerializer(serializers.ModelSerializer):
cita = CitaSerializers()
user = UserInfoSerializer()
class Meta:
model = Transaccion
fields = ['id', 'tipo', 'monto', 'descripcion', 'fecha', 'cita', 'user', 'url']
def validate_monto(self, value):
if value <= 0:
raise ValidationError("El monto de la transacción debe ser mayor que cero.")
return value
def validate_tipo(self, value):
if value not in ['INGRESO', 'GASTO']:
raise ValidationError("El tipo de transacción debe ser 'INGRESO' o 'GASTO'.")
return value
def validate(self, data):
cita = data.get('cita')
if not cita:
raise ValidationError("Debe asociar una cita válida.")
if cita.precio <= 0:
raise ValidationError("El precio de la cita asociada debe ser mayor que cero.")
usuario = data.get('user')
if not usuario:
raise ValidationError("Debe asociar un usuario válido.")
return data
Пожалуйста, помогите мне, я только начинаю жить в этом мире, любая помощь приветствуется.
'User' object has no attribute 'user'.
- это ключевая часть поднятого исключения.
Удалите user
из списка полей в UserSerializer
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ['id', 'first_name', 'last_name']