[Django]-How to define two fields "unique" as couple

930πŸ‘

βœ…

There is a simple solution for you called unique_together which does exactly what you want.

For example:

class MyModel(models.Model):
  field1 = models.CharField(max_length=50)
  field2 = models.CharField(max_length=50)

  class Meta:
    unique_together = ('field1', 'field2',)

And in your case:

class Volume(models.Model):
  id = models.AutoField(primary_key=True)
  journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name = "Journal")
  volume_number = models.CharField('Volume Number', max_length=100)
  comments = models.TextField('Comments', max_length=4000, blank=True)

  class Meta:
    unique_together = ('journal_id', 'volume_number',)
πŸ‘€Jens

231πŸ‘

Django 2.2+

Using the constraints features UniqueConstraint is preferred over unique_together.

From the Django documentation for unique_together:

Use UniqueConstraint with the constraints option instead.
UniqueConstraint provides more functionality than unique_together.
unique_together may be deprecated in the future.

For example:

class Volume(models.Model):
    id = models.AutoField(primary_key=True)
    journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name="Journal")
    volume_number = models.CharField('Volume Number', max_length=100)
    comments = models.TextField('Comments', max_length=4000, blank=True)

    class Meta:
        constraints = [
            models.UniqueConstraint(fields=['journal_id', 'volume_number'], name='name of constraint')
        ]
πŸ‘€daaawx

14πŸ‘

in Django 4.0,

The new *expressions positional argument of UniqueConstraint() enables
creating functional unique constraints on expressions and database
functions. For example:

from django.db import models
from django.db.models import UniqueConstraint
from django.db.models.functions import Lower


class MyModel(models.Model):
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)

    class Meta:
        constraints = [
            UniqueConstraint(
                Lower('first_name'),
                Lower('last_name').desc(),
                name='first_last_name_unique',
            ),
        ]
πŸ‘€SuperNova

7πŸ‘

Yes you can define more than one field as unique using Django class Meta as this example:

class Volume(models.Model):
    id = models.AutoField(primary_key=True)
    journal_id = models.ForeignKey(Journals, db_column='jid', null=True, verbose_name = "Journal")
    volume_number = models.CharField('Volume Number', max_length=100)
    comments = models.TextField('Comments', max_length=4000, blank=True)

    class Meta:
        unique_together = ('volume_number', 'journal_id') 

Note:
To make things go writes you should not add attribute unique=True to any field that you define in unique_together attribute otherwise it will not work as unique together.

4πŸ‘

In Django 4.1.1

from django.db import models

class Volume(models.Model):
    field_1 = models.CharField("field 1", max_length=100,)
    field_2 = models.CharField("field 2", max_length=100,)
    field_3 = models.CharField("field 3", max_length=100,)


    class Meta:
        unique_together = [['field_1', 'field_2']]
πŸ‘€Yacine Bs

Leave a comment