Reputation: 433
Here I have a User model:
class User(AbstractUser):
plate_number = models.CharField(max_length=10, blank=True, null=True)
and a Vehicle model:
class Vehicle(models.Model):
plate_number = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
I do not think my design is correct, because plate_number in Vehicle model is not CharField but User in this way.
How to make two plate_number exactly the same in two models?
The logic is, a User MAY NOT have a plate_number but a vehicle MUST HAVE a same plate_number existing in User model, a user can have AT MOST ONE vehicle and a vehicle only belongs to one User, and I would like either field change, then the counterpart field makes the same change automatically.
Is this possible? How about
class User(AbstractUser):
vehicle = models.OneToOneField('ride.Vehicle', blank=True, null=True, on_delete=models.SET_NULL())
and
class Vehicle(models.Model):
plate_number = models.CharField(max_length=10, on_delete=models.CASCADE, primary_key=True, blank=False, null=False)
Will this work?
Upvotes: 1
Views: 279
Reputation: 51968
I don't see any point of having duplicate plate numbers. As you have defined a OneToOne relationship between user and Vehicle, means one user can only have one Vehicle. So, I think its best you should keep both plate number and OneToOne connection in Vehicle model class, like this:
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")
Here I have defined related_name
in Vehicle model.
So in this setup a user can have one plate number only as he has connection to one vehicle. And when accessing that data you can simply get it by:
user = User.objects.first()
user.vehicle # Vehicle object
user.vehicle.plate_number # plate number
Upvotes: 1
Reputation: 3094
This can be done like this
User Model:
class User(AbstractUser):
plate_number = models.CharField(max_length=10, blank=True, null=True)
Vehicle Model:
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)
So when you are saving vehicle check user with this plate number exists then save the user in vehicle if not then user is null and save plate number in char field.
Upvotes: 0