Django:如何在两个模型中绑定两个字段,即使它们完全相同?

时间:2019-02-06 03:25:33

标签: django django-models django-views

这里我有一个用户模型:

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不是CharField,而是User。

如何在两个模型中使两个 plate_number 完全相同?

逻辑是,用户可能没有板号,而车辆必须在用户模型中存在相同的板号,用户可以拥有 AT MOST一辆车辆和一辆车辆仅属于一个用户,我想更改其中任何一个,然后对方字段自动进行相同的更改。

这可能吗?怎么样

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 :(得分:1)

我看不到重复的车牌号。正如您在用户和车辆之间定义了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")

在这里,我已经在Vehicle模型中定义了related_name

因此,在此设置中,用户只有在与一辆车辆连接时才能拥有一个车牌号。当访问该数据时,您可以通过以下方式简单地获取它:

user = User.objects.first()
user.vehicle # Vehicle object
user.vehicle.plate_number # plate number

答案 1 :(得分:0)

可以这样做

用户模型:

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)

因此,当您保存车辆时,请检查是否存在该车牌号的用户,如果不存在,则将该用户保存在车中,然后用户为空,并将车牌号保存在char字段中。