Не удалось получить ограничение NOT NULL: locations_location.city_id в DRF
Когда я пытаюсь создать объект через DRF serailizers в моем api, я получаю ошибку NOT NULL constraint failed: locations_location.city_id
.
Я посмотрел на аналогичный здесь и представленное решение кажется именно тем, с которого я начинал.
Мои модели:
class City(models.Model):
code = models.CharField(max_length=4, default="", blank=False, unique=True)
name = models.CharField(max_length=40, default="", blank=False, unique=True)
time_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.name}, ({self.code})"
class Meta:
verbose_name = "City"
verbose_name_plural = "Cities"
class Location(models.Model):
status_choice = (
("Available", "Available"),
("Unavailable", "Unavailable"),
("Active", "Active"),
)
city = models.ForeignKey(City, on_delete=models.CASCADE, related_name="locations")
name = models.CharField(max_length=256, default="", blank=True)
rent = models.DecimalField(max_digits=7, decimal_places=2)
email = models.EmailField(max_length=64)
phone = models.CharField(max_length=20, default="", blank=True)
lon = models.DecimalField(max_digits=7, decimal_places=5, blank=True, null=True)
lat = models.DecimalField(max_digits=7, decimal_places=5, blank=True, null=True)
street_number = models.CharField(max_length=50, null=True)
street_name = models.CharField(max_length=50, null=True)
postal_code = models.CharField(max_length=50, null=True)
status = models.CharField(max_length=50, choices=status_choice, default="Available")
time_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.name} {self.status}"
Мои серализаторы:
class CitySerializer(serializers.ModelSerializer):
locations = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = City
fields = "__all__"
def create(self, validated_data):
return City.objects.create(**validated_data)
class LocationSerializer(serializers.ModelSerializer):
location_events = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
booked_days = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = Location
fields = "__all__"
depth = 1
def create(self, validated_data):
city = serializers.PrimaryKeyRelatedField( # noqa
many=False, queryset=City.objects.all()
)
return Location.objects.create(**validated_data)
Это фальшивые тестовые данные, переданные api в POST-запросе:
{
"name": "Darmstadt Hotel",
"city": 1,
"email": "fischernicolai@nohlmans.de",
"phone": "+49(0)7219 993238",
"rent": 275.38,
"lat": 52.9427,
"lon": 12.1076,
"street_name": "Eimerstra\\u00dfe",
"street_number": "34",
"postal_code": "80843",
"status": "Available"
}
Город с идентификатором 1 существует в базе данных и доступен через api.
Во-первых, у вас поле city в LocationSerializer
находится внутри метода create
, это должно быть ошибкой? Это должна быть строка ниже booked_days = ...
.
Однако я не уверен, что это решит проблему.
class LocationSerializer(serializers.ModelSerializer):
location_events = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
booked_days = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
city = serializers.PrimaryKeyRelatedField( # noqa
many=False, queryset=City.objects.all()
) # Move it here
class Meta:
model = Location
fields = "__all__"
depth = 1
def create(self, validated_data):
return Location.objects.create(**validated_data)