رابطه یک به یک - OneToOne


در رابطه One-To-One، هر رکورد از یک مدل می‌تواند، دقیقاً با یک و فقط یک رکورد از مدل دیگر مرتبط باشد و بالعکس، برخلاف رابطه ForeignKey — رابطه فرزند و والد — در رابطه OneToOne هر دو طرف تنها یک همسر دارند!

One2OneField

نمونه‌های دنیای واقعی


  • هر کاربر (User) فقط یک پروفایل (Profile) دارد و همینطور یک ‌پروفایل نیز فقط متعلق به یک کاربر است.
  • هر شرکت (Company) فقط یک مدیرعامل (Ceo) دارد و همینطور یک مدیرعامل فقط مالک یک شرکت است.
  • هر خودرو (Car) فقط یک شماره شاسی (VIN) دارد و همینطور یک شماره شاسی متعلق به یک خودرو می‌باشد.

برای استفاده از رابطه one-to-one در مدل‌های جنگو باید از گزینه OneToOneField برای فیلد استفاده نمود تا بدین صورت رابطه یک به یک (one-to-one) را تعریف کرد.

clientapp/models.py

# clientapp.models.py
from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE) # OneToOne Field
    mobile = models.CharField(max_length=15, unique=True)
    birth = models.DateField(null=True, blank=True)
    avatar = models.ImageField(upload_to='profiles/', null=True, blank=True)
    id = models.UUIDField(default=uuid.uuid4, primary_key=True, unique=True, editable=False)

    def __str__(self):
        return self.user.username