Джанго: Как связать два поля в двух моделях, т.е. сделать их абсолютно одинаковыми? - PullRequest
0 голосов
/ 06 февраля 2019

Здесь у меня есть Пользователь модель:

class User(AbstractUser):
    plate_number = models.CharField(max_length=10, blank=True, null=True)

и Автомобиль модель:

class Vehicle(models.Model):
    plate_number = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)

Я не думаю, что мойдизайн правильный, потому что plate_number в модели Vehicle - это не CharField, а пользователь таким образом.

Как сделать два plate_number абсолютно одинаковыми в двух моделях?

Логикапользователь НЕ МОЖЕТ иметь номер_платы, но транспортное средство ДОЛЖНО ИМЕТЬ такой же номер_платы, существующий в модели пользователя, пользователь может иметь НА МОСТЕ транспортное средство итранспортное средство принадлежит только одному пользователю, и я хотел бы, чтобы любое из полей было изменено, тогда поле аналога делает то же самое изменение автоматически.

Возможно ли это?Как насчет

class User(AbstractUser):
    vehicle = models.OneToOneField('ride.Vehicle', blank=True, null=True, on_delete=models.SET_NULL())

и

class Vehicle(models.Model):
    plate_number = models.CharField(max_length=10, on_delete=models.CASCADE, primary_key=True, blank=False, null=False)

Будет ли это работать?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Не вижу смысла иметь дубликаты номеров.Поскольку вы определили отношение OneToOne между пользователем и транспортным средством, это означает, что один пользователь может иметь только один автомобиль.Итак, я думаю, что лучше всего вам сохранить номерной знак и соединение OneToOne в классе модели транспортного средства, например:

class Vehicle(models.Model):
    plate_number = models.CharField(max_length=10)
    user= models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True, related_name="vehicle")

Здесь я определил related_name в модели транспортного средства.

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

user = User.objects.first()
user.vehicle # Vehicle object
user.vehicle.plate_number # plate number
0 голосов
/ 06 февраля 2019

Это можно сделать следующим образом

Модель пользователя:

class User(AbstractUser):
    plate_number = models.CharField(max_length=10, blank=True, null=True)

Модель автомобиля:

class Vehicle(models.Model):
    plate_number = models.CharField(max_length=10, on_delete=models.CASCADE, primary_key=True, blank=False, null=False)
    user= models.OneToOneField(User, on_delete=models.CASCADE, blank=True, null=True)

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

...