OEurix
OEurix

Reputation: 433

Django: How to bind two fields in two models, i.e. make them exactly the same?

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

Answers (2)

ruddra
ruddra

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

Manzurul Hoque Rumi
Manzurul Hoque Rumi

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

Related Questions