Django Bulk_create() с несуществующим ForeignKey

У меня есть 2 модели. Для простоты я удалил все ненужные поля.

      class User(models.Model):
    id = models.CharField(max_length=36, primary_key=True, null=False)
    age = models.IntegerFiels(default=-1)

и

      class Device(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)

Через API я получаю информацию об устройствах и создаю список с устройствами.

      devices = []
for device_data in data:
    devices.append(
        Device(
            user_id=device_data("user_id")
        )
    )

Получив список устройств, я добавляю его в базу данных.


Проблема в том, что если при создании Устройства я указал user_id, которого нет в базе данных, то у меня произойдет сбой, потому что я пытаюсь связать с несуществующим идентификатором.

Теперь, чтобы обойти это, я делаю следующее:

      devices = []
users = []
for device_data in data:
    users.append(
        User(
            id=device_data("user_id", age = -1)
        )
    )
    devices.append(
        Device(
            user_id=device_data("user_id")
        )
    )

Затем при сохранении:

      User.objects.bulk_create(users, ignore_conflicts=True)
Device.objects.bulk_create(devices, ignore_conflicts=True)
User.objects.filter(age=-1).delete()

Как сделать, чтобы при сохранении, если указанный user_id не существует, это устройство не добавлялось?

ОБНОВЛЕНО:

Другое решение — изменить поле

      User.age = models.IntegerFiels(null=True) 

и

       Device.user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)

После этого я могу сохранять устройства без пользователей.

      Device.objects.bulk_create(devices, ignore_conflicts=True)

После этого выполните:Device.objects.filter(user__age__isnull=True).delete().

Это работает, но мне не нравится то, что нужно проверять возраст, а не самого пользователя.

0 ответов

Другие вопросы по тегам