python.django.best-practice.use-onetoonefield.use-onetoonefield

Author
6,013
Download Count*
License
Use 'django.db.models.OneToOneField' instead of 'ForeignKey' with unique=True. 'OneToOneField' is used to create one-to-one relationships.
Run Locally
Run in CI
Defintion
rules:
- id: use-onetoonefield
patterns:
- pattern-inside: |
class $M(...):
...
- pattern: $F = django.db.models.ForeignKey(..., unique=True, ...)
message: Use 'django.db.models.OneToOneField' instead of 'ForeignKey' with
unique=True. 'OneToOneField' is used to create one-to-one relationships.
languages:
- python
severity: WARNING
metadata:
category: best-practice
technology:
- django
license: Commons Clause License Condition v1.0[LGPL-2.1-only]
Examples
use-onetoonefield.py
# https://stackoverflow.com/questions/5870537/whats-the-difference-between-django-onetoonefield-and-foreignkey/5891861#5891861
from django.db import models
class Engine(models.Model):
name = models.CharField(max_length=25)
def __unicode__(self):
return self.name
class Car(models.Model):
name = models.CharField(max_length=25)
# ok: use-onetoonefield
engine = models.OneToOneField(Engine)
def __unicode__(self):
return self.name
class Engine2(models.Model):
name = models.CharField(max_length=25)
def __unicode__(self):
return self.name
class Car2(models.Model):
name = models.CharField(max_length=25)
# ruleid: use-onetoonefield
engine = models.ForeignKey(Engine2, unique=True, on_delete=models.CASCADE)
def __unicode__(self):
return self.name
Short Link: https://sg.run/W8Q2