Хранение объекта со связанной моделью приводит к IntegrityError: нулевое значение нарушает ненулевое ограничение - PullRequest
0 голосов
/ 22 февраля 2019

У меня возникла следующая проблема с использованием Django и Tastypie.Странно, около года или около того, следующие работали безупречно.Теперь, когда я пытаюсь отредактировать Car на Owner и сохранить Owner, я получаю эту ошибку:

django.db.utils.IntegrityError: нулевое значение в столбце "car_id"нарушает ненулевое ограничение ДЕТАЛИ: В ошибочной строке содержится (55, test, 53, null).

Я знаю, что могу изменить поле car в модели Wheel на nullable, ноЯ определенно хочу, чтобы это отношение было определено.Как ни странно, когда я изменил поле на nullable для тестирования, идентификатор был установлен в моей базе данных.Затем, когда я делаю другое редактирование, запись базы данных не обновляется, а вместо этого создается новая запись.Эта запись снова содержит правильный идентификатор, но старая запись теряет его, а поле остается пустым.

Вот как выглядит таблица wheel после ее редактирования на объекте Car два раза:

postgres=# TABLE wheel;
id | value | wheel_type_id | car_id
---+-------+---------------+--------
53 | abc   |            53 |
54 | def   |            53 |     11
(2 rows)

Вместо этого мой желаемый результат будет следующим:

postgres=# TABLE wheel;
id | value | wheel_type_id | car_id
---+-------+---------------+--------
53 | def   |            53 |     11
(1 row)

Модели:

class Owner(models.Model):
    id = models.AutoField(primary_key=True)

class Car(models.Model):
    owner = models.OneToOneField('Owner', null=True, related_name='car',
                                  on_delete=models.CASCADE)
    ready = models.BooleanField(default=False)

class Wheel(models.Model):
    car = models.ForeignKey(Car, related_name='wheel',
                            on_delete=models.CASCADE)
    wheel_type = models.ForeignKey(WheelType, related_name='names',
                                   on_delete=models.CASCADE)
    value = models.CharField(max_length=500)

Ресурсы Tastypie:

class OwnerResource(ModelResource):
    car = fields.ToOneField('CarResource', null=True, full=True,       
                             attribute='car')

class CarResource(ModelResource):
    wheels = fields.ToManyField('WheelResource', 'wheels', null=True,
                                 blank=True, full=True)

class WheelResource(ModelResource):
    wheeltype = fields.ForeignKey('WheelTypeResource',   
                                  'wheel_type', full=False)


    class Meta:
        queryset = Wheel.objects.all()
        allowed_methods = ['get']
        ordering = ['modified']
        excludes = ['id']
        include_resource_uri = False
        limit = 100
        authorization = Authorization()
        always_return_data = True

Пример запроса:

fetch("http://0.0.0.0:8000/api/v1/owner/1/", {
    "credentials": "include",
    "headers": {
        "accept": "application/json",
        "accept-language": "de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7",
        "cache-control": "no-cache",
        "content-type": "application/json",
        "pragma": "no-cache",
        "x-csrftoken": "3sarlkh0giQ7yqhTSclCivfEsSvs5R3a7gTw0pw293v80ypCT6n3Drm8AhQDx3GB"
    },
    "referrer": "http://0.0.0.0:8000/backend/owner/1",
    "referrerPolicy": "no-referrer-when-downgrade",
    "body": "{\"car\":{\"resource_uri\":\"/api/v1/car/3/\",\"wheels\":[{\"wheeltype\":\"/api/v1/wheeltype/identificationInfo/\",\"value\":\"abc\"}]},\"resource_uri\":\"/api/v1/owner/1/\",}",
    "method": "PATCH",
    "mode": "cors"
});

У кого-нибудь есть подсказка, почему car_id не определяется при сохранении объекта, но когда поле обнуляется, оно все равно устанавливается?Начинаю думать, что это может быть ошибка Tastypie или Django.

...