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

profile photo of semgrepsemgrep
Author
6,013
Download Count*

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