Как заполнить базу данных, имеющую внешний ключ, из пользовательского интерфейса swagger?
Я создаю приложение на django. И у меня есть модель пользователя, модель Dso... Модель пользователя должна иметь поле, которое является экземпляром модели Dso.
По сути, существует связь между моделями. Все настроено из кодовой базы, когда я пытаюсь зарегистрировать нового пользователя в gui моего сервера, я бы увидел там связь.
Когда я пытаюсь зарегистрироваться в swaggerUI, я обычно должен сделать входной JSON словарь, что-то вроде этого.
{
"email": "name@example.com",
"username": "example",
"password": "example",
"name": "example",
"address": "My Address",
"customerId": "example",
**"dso": 4**,
"roleId": 2
}
Из вышесказанного следует, что 4 должен быть экземпляром таблицы/модели DSO, которая имеет id 4 но тогда swagger всегда возвращает внутреннюю ошибку сервера с ошибкой "Невозможно присвоить "4": "User.dso" должен быть экземпляром "Dso"."
Я не знаю, как представить отношение foreignkey в JSON.
Вот моя база кода:
UserModel:
class User(AbstractBaseUser, PermissionsMixin):
dso = models.ForeignKey(to=Dso,related_name='dso',null=True,on_delete=models.CASCADE)
name = models.CharField(max_length=70)
address = models.CharField(max_length=70)
roleId = models.IntegerField(default=1)
customerId = models.CharField(max_length=70, blank=False, default='')
username=models.CharField(max_length=255, unique=True, db_index=True)
email=models.EmailField(max_length=255, unique=True, db_index=True)
is_verified = models.BooleanField(default=False)
is_active = models.BooleanField(default=True)
is_trading = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
created_at=models.DateTimeField(auto_now_add=True)
updated_at=models.DateTimeField(auto_now=True)
@property
def energy_data(self):
energydata = EnergyData.objects.filter(customerId=self.customerId).first()
return energydata
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['username','name','address','roleId','customerId','dso']
objects = UserManager()
def __str__(self) -> str:
return self.email
User Manager:
class UserManager(BaseUserManager):
def create_user(self, username, email, name, address,roleId,customerId,dso,password=None):
if username is None:
raise TypeError('User should have a userame')
if email is None:
raise TypeError('Users should have a Email')
user = self.model(username=username , email = self.normalize_email(email), name=name, address=address, roleId=roleId, customerId=customerId, dso=dso)
user.set_password(password)
user.save()
return user
Модель Dso:
class Dso(models.Model):
supplier = models.CharField(max_length=70)
RegisterSerializer:
class RegisterSerializer(serializers.ModelSerializer):
password = serializers.CharField(max_length = 68, min_length=6, write_only = True)
name = serializers.CharField(max_length = 68, min_length=6)
address = serializers.CharField(max_length = 68, min_length=6)
customerId = serializers.CharField(max_length = 68, min_length=6)
roleId = serializers.IntegerField()
dso = serializers.IntegerField()
class Meta:
model=User
fields=['email','username','password','name','address','customerId',
'dso', 'roleId']
def validate(self, attrs):
email = attrs.get('email', '')
username = attrs.get('username', '')
name = attrs.get('name', '')
address = attrs.get('address', '')
customerId = attrs.get('customerId', '')
if not len(username) >= 4:
raise serializers.ValidationError('Username must be morethan 4 letters or characters')
return attrs
def create(self, validated_data):
return User.objects.create_user(**validated_data)
UserSerializer:
class UserSerializer(serializers.ModelSerializer):
energy_data = EnergyDataSerializer(read_only=True)
dso = DsoSerializer(read_only = True)
class Meta:
model = User
fields = ('__all__'
)
depth = 1
Пожалуйста, Ваш ответ или ответ будет очень полезен. Спасибо
Вы должны использовать PrimaryKeyRelatedField
вместо IntegerField
в вашем сериализаторе:
class RegisterSerializer(serializers.ModelSerializer):
password = serializers.CharField(max_length = 68, min_length=6, write_only = True)
name = serializers.CharField(max_length = 68, min_length=6)
address = serializers.CharField(max_length = 68, min_length=6)
customerId = serializers.CharField(max_length = 68, min_length=6)
roleId = serializers.IntegerField()
dso = serializers.PrimaryKeyRelatedField(allow_null=True, queryset=Dso.objects.all())
class Meta:
model=User
fields=['email','username','password','name','address','customerId',
'dso', 'roleId']
def validate(self, attrs):
email = attrs.get('email', '')
username = attrs.get('username', '')
name = attrs.get('name', '')
address = attrs.get('address', '')
customerId = attrs.get('customerId', '')
if not len(username) >= 4:
raise serializers.ValidationError('Username must be morethan 4 letters or characters')
return attrs
def create(self, validated_data):
return User.objects.create_user(**validated_data)