Django ContentTypes преобразовывает поле uuid в целочисленное поле - PullRequest
1 голос
/ 02 мая 2020

У меня есть ситуация, когда object_id для ForeignKey принимает PositiveIntegerField, но все id's моих моделей установлены как uuid.

Я посмотрел документацию и обнаружил, что я следует использовать get_prep_value(value) или get_db_prep_value(value, connection, prepared=False)¶

Вопрос в том, как именно мне это сделать?

Вот код модели, который содержит foreignRelation

target_ct = models.ForeignKey(ContentType,
                              blank=True,
                              null=True,
                              related_name='target_obj',
                              on_delete=models.CASCADE)
target_id = models.PositiveIntegerField(null=True,
                                        blank=True,
                                        db_index=True)
target = GenericForeignKey('target_ct', 'target_id')

created_at = models.DateTimeField(auto_now_add=True,
                                  db_index=True)

Поле из всех других моделей

id = models.UUIDField(default=uuid4, primary_key=True, editable=False)

Всякий раз, когда я пытаюсь сохранить модель с текущими настройками, я получаю эту ошибку

django .db.utils.DataError: целое число вне диапазона

1 Ответ

1 голос
/ 02 мая 2020

Вы также делаете его UUIDField:

class MyModel(models.Model):
    target_ct = models.ForeignKey(
        ContentType,
        blank=True,
        null=True,
        related_name='target_obj',
        on_delete=models.CASCADE
    )
    target_id = models.<b>UUIDField(</b>
        null=True,
        blank=True,
        db_index=True
    <b>)</b>
    target = GenericForeignKey('target_ct', 'target_id')
    created_at = models.DateTimeField(auto_now_add=True, db_index=True)

Затем вы можете ссылаться на все объекты, которые имеют UUIDField в качестве первичного ключа.

Именно это, однако, одна из причин, почему часто лучше использовать AutoField в качестве первичного ключа: если все модели имеют одинаковый первичный ключ, вы можете ссылаться на все объекты с этим. Теперь с этим вы можете ссылаться только на модели с UUIDField в качестве первичного ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...