593 Stimmen

Wie definiert man zwei Felder "unique" als Paar

Gibt es eine Möglichkeit, ein paar Felder als eindeutig in Django zu definieren?

Ich habe eine Tabelle mit Bänden (von Zeitschriften), und ich möchte nicht mehr als eine Bandnummer für dieselbe Zeitschrift.

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)

Ich habe versucht, die unique = True als Attribut in den Feldern journal_id y volume_number aber es funktioniert nicht.

950voto

Jens Punkte 18659

Es gibt eine einfache Lösung für Sie, nämlich einzigartig_gemeinsam die genau das tut, was Sie wollen.

Zum Beispiel:

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

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

Und in Ihrem Fall:

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',)

240voto

daaawx Punkte 2788

Django 2.2+

Die Verwendung des constraints Merkmale UniqueConstraint ist vorzuziehen gegenüber einzigartig_gemeinsam .

Aus der Django-Dokumentation für unique_together :

Verwenden Sie stattdessen UniqueConstraint mit der Option constraints.
UniqueConstraint bietet mehr Funktionalität als unique_together.
unique_together kann in Zukunft veraltet sein.

Zum Beispiel:

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')
        ]

17voto

SuperNova Punkte 20412

In Django 4.0,

Das neue Positionsargument *expressions von UniqueConstraint() ermöglicht die Erstellung funktionaler eindeutiger Beschränkungen für Ausdrücke und Datenbank Funktionen. Zum Beispiel:

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',
            ),
        ]

7voto

Diaa M. Shalabi Punkte 960

Ja, Sie können mehr als ein Feld als eindeutig definieren, indem Sie die Django-Klasse Meta wie in diesem Beispiel verwenden:

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') 

Anmerkung:
Um die Dinge schriftlich festzuhalten, sollten Sie nicht das Attribut unique=True zu jedem Feld, das Sie in unique_together Attribut, da es sonst nicht so eindeutig zusammen funktioniert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X