Django: реализация модели с использованием хеша ForeignKey - PullRequest
0 голосов
/ 08 октября 2018

В настоящее время я пытаюсь реализовать API в Django Rest для проекта класса, который должен безопасно хранить данные.У меня есть две разные модели:

class Driver(models.Model):
     name = models.CharField(max_length=100, blank=False, null=False)

и

import Driver

class Car(models.Model):
     name = models.CharField(max_length=100, blank=False, null=False)
     driver = models.ForeignKey(Driver, on_delete=models.CASCADE)

В настоящее время существует сопоставление между автомобилями и их соответствующими водителями.Я хотел бы сопоставить автомобиль не с его драйвером, а с результатом использования хеш-функции для его имени водителя.Что-то вроде:

import Driver
import hashlib 

class Car(models.Model):
     name = models.CharField(max_length=100, blank=False, null=False)
     driver = hashlib.md5(models.ForeignKey(Driver, on_delete=models.CASCADE).name).hexdigest()

Я знаю, что то, что я написал выше, вероятно, еретическое в Django, просто для того, чтобы передать идею того, что я хочу сделать!Я думал о переопределении функций инициализации, сохранения, создания модели автомобиля, чтобы сделать это, но не имел ни малейшего представления, что является хорошим вариантом.В конце процесса я хотел бы, чтобы между автомобилем и его водителем не было сопоставления, но автомобиль водителя можно найти, используя хэш его имени.

Дайте мне знать, если это неясно или есливам нужно больше точности!

Любая помощь будет оценена,

Спасибо!

1 Ответ

0 голосов
/ 08 октября 2018

Вы хотите удалить явную ссылку с Car на Driver, поэтому не следует использовать ForeignKey.Обратите внимание, что недостатком является то, что вы не можете использовать базу данных JOIN для получения автомобиля для водителя, но вам придется выполнить дополнительный запрос.

Создайте методы на ваших моделях Car и Driver для назначенияводитель и для получения автомобиля:

class Car(models.Model):
    ...
    driver = models.CharField(max_length=255)

    def assign_driver(self, driver):
         self.driver = hashlib.md5(driver.name).hexdigest()

class Driver(models.Model):

    @property
    def car(self):
        try:
            return Car.objects.get(driver=hashlib.md5(self.name).hexdigest())
        except Car.DoesNotExist:
            return None

Таким образом, вы можете my_driver.car выбрать автомобиль для этого водителя some_car.assign_driver(my_driver); some_car.save(), чтобы назначить и сохранить водителя.

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