Alternativ för modell Meta
¶
Detta dokument förklarar alla möjliga metadata options som du kan ge din modell i dess interna class Meta
.
Tillgängliga Meta
-alternativ¶
abstrakt
¶
- Options.abstract¶
Om
abstract = True
, kommer denna modell att vara en :ref:abstrakt basklass <abstract-base-classes>
.
app_label
¶
- Options.app_label¶
Om en modell definieras utanför en applikation i
INSTALLED_APPS
, måste den ange vilken app den tillhör:app_label = "myapp"
Om du vill representera en modell med formatet
app_label.object_name
ellerapp_label.model_name
kan du användamodel._meta.label
respektivemodel._meta.label_lower
.
bas_chefsnamn
¶
- Options.base_manager_name¶
Attributnamnet på hanteraren, t.ex.
'objects'
, som ska användas för modellens_base_manager
.
db_table
¶
- Options.db_table¶
Namnet på den databastabell som ska användas för modellen:
db_table = "music_album"
Tabellnamn¶
För att spara tid härleder Django automatiskt namnet på databastabellen från namnet på din modellklass och den app som innehåller den. Namnet på en modells databastabell konstrueras genom att modellens ”app label” - det namn du använde i manage.py startapp
- kopplas till modellens klassnamn, med ett understreck mellan dem.
Om du t.ex. har en app bookstore
(som skapats av manage.py startapp bookstore
), kommer en modell som definieras som class Book
att ha en databastabell med namnet bookstore_book
.
Om du vill åsidosätta databasens tabellnamn använder du parametern db_table
i class Meta
.
Om tabellnamnet i din databas är ett reserverat SQL-ord eller innehåller tecken som inte är tillåtna i Python-variabelnamn - särskilt bindestrecket - är det OK. Django citerar kolumn- och tabellnamn bakom kulisserna.
Använd tabellnamn med små bokstäver för MariaDB och MySQL
Det rekommenderas starkt att du använder tabellnamn med gemener när du åsidosätter tabellnamnet via db_table
, särskilt om du använder MySQL-backend. Se MySQL notes för mer information.
Tabellnamn som citeras för Oracle
För att uppfylla den begränsning på 30 tecken som Oracle har för tabellnamn och för att matcha de vanliga konventionerna för Oracle-databaser kan Django förkorta tabellnamn och göra dem till versaler. För att förhindra sådana omvandlingar, använd ett citerat namn som värde för db_table
:
db_table = '"name_left_in_lowercase"'
Sådana citerade namn kan också användas med Djangos andra stödda databasbackends; med undantag för Oracle har citaten dock ingen effekt. Se :ref:Oracle notes <oracle-notes>
för mer information.
db_table_comment
¶
- Options.db_table_comment¶
Kommentaren om databastabellen som ska användas för den här modellen. Det är användbart för att dokumentera databastabeller för personer med direkt databasåtkomst som kanske inte tittar på din Django-kod. Till exempel:
class Answer(models.Model):
question = models.ForeignKey(Question, on_delete=models.CASCADE)
answer = models.TextField()
class Meta:
db_table_comment = "Question answers"
db_tablespace
¶
- Options.db_tablespace¶
Namnet på det databas-tabellutrymme som ska användas för den här modellen. Standardvärdet är projektets
DEFAULT_TABLESPACE
-inställning, om den är inställd. Om backend inte stöder tablespaces ignoreras detta alternativ.
förvaltarens_namn
¶
- Options.default_manager_name¶
Namnet på den manager som ska användas för modellens
_default_manager
.
”Hämta senaste by¶
- Options.get_latest_by¶
Namnet på ett fält eller en lista med fältnamn i modellen, vanligtvis
DateField
,DateTimeField
ellerIntegerField
. Detta anger det eller de standardfält som ska användas i din modellManager
:s metoderlatest()
ochearliest()
.Exempel:
# Latest by ascending order_date. get_latest_by = "order_date" # Latest by priority descending, order_date ascending. get_latest_by = ["-priority", "order_date"]
Se
latest()
-dokumenten för mer information.
hanterad
¶
- Options.managed¶
Standardvärdet är
True
, vilket innebär att Django kommer att skapa lämpliga databastabeller imigrate
eller som en del av migreringar och ta bort dem som en del av ettflush
-hanteringskommando. Det vill säga, Django hanterar databastabellernas livscykler.Om
False
, kommer inga åtgärder för att skapa, ändra eller ta bort databastabeller att utföras för denna modell. Detta är användbart om modellen representerar en befintlig tabell eller en databasvy som har skapats på något annat sätt. Detta är den enda skillnaden närmanaged=False
. Alla andra aspekter av modellhanteringen är exakt desamma som normalt. Detta inkluderarLägga till ett automatiskt primärnyckelfält i modellen om du inte deklarerar det. För att undvika förvirring för senare kodläsare rekommenderas att du anger alla kolumner från den databastabell du modellerar när du använder ohanterade modeller.
Om en modell med
managed=False
innehåller enManyToManyField
som pekar på en annan ohanterad modell, så kommer inte heller den mellanliggande tabellen för many-to-many join att skapas. Men den mellanliggande tabellen mellan en hanterad och en ohanterad modell kommer att skapas.Om du behöver ändra detta standardbeteende skapar du den mellanliggande tabellen som en explicit modell (med
managed
inställt efter behov) och använder attributetManyToManyField.through
för att relationen ska använda din anpassade modell.
För tester som involverar modeller med
managed=False
är det upp till dig att se till att rätt tabeller skapas som en del av testinställningen.Om du är intresserad av att ändra beteendet på Python-nivå för en modellklass, skulle du kunna använda
managed=False
och skapa en kopia av en befintlig modell. Det finns dock ett bättre tillvägagångssätt för den situationen: Proxy-modeller.
”ordning_med_respekt_för¶
- Options.order_with_respect_to¶
Gör detta objekt beställningsbart med avseende på det angivna fältet, vanligtvis en
ForeignKey
. Detta kan användas för att göra relaterade objekt beställningsbara med avseende på ett överordnat objekt. Till exempel:, om ettAnswer
relaterar till ettQuestion
-objekt, och en fråga har mer än ett svar, och ordningen på svaren spelar roll, skulle du göra så här:from django.db import models class Question(models.Model): text = models.TextField() # ... class Answer(models.Model): question = models.ForeignKey(Question, on_delete=models.CASCADE) # ... class Meta: order_with_respect_to = "question"
När
order_with_respect_to
är inställd, tillhandahålls två ytterligare metoder för att hämta och ställa in ordningen på de relaterade objekten:get_RELATED_order()
ochset_RELATED_order()
, därRELATED
är modellnamnet med gemener. Om man t.ex. antar att ettQuestion
-objekt har flera relateradeAnswer
-objekt, innehåller den returnerade listan primärnycklarna för de relateradeAnswer
-objekten:>>> question = Question.objects.get(id=1) >>> question.get_answer_order() [1, 2, 3]
Ordningen på ett
Question
-objekts relateradeAnswer
-objekt kan ställas in genom att skicka in en lista medAnswer
-primärnycklar:>>> question.set_answer_order([3, 1, 2])
De relaterade objekten får också två metoder,
get_next_in_order()
ochget_previous_in_order()
, som kan användas för att komma åt dessa objekt i rätt ordning. Anta att objektenAnswer
är ordnade efterid
:>>> answer = Answer.objects.get(id=2) >>> answer.get_next_in_order() <Answer: 3> >>> answer.get_previous_in_order() <Answer: 1>
order_with_respect_to
ställer implicit in alternativet ordering
Internt lägger order_with_respect_to
till ett extra fält/databaskolumn med namnet _order
och sätter modellens ordering
-alternativ till detta fält. Följaktligen kan inte order_with_respect_to
och ordering
användas tillsammans, och den ordning som läggs till av order_with_respect_to
kommer att gälla när du hämtar en lista med objekt av denna modell.
Ändra order_med_respekt_för
Eftersom order_with_respect_to
lägger till en ny databaskolumn måste du se till att göra och tillämpa lämpliga migreringar om du lägger till eller ändrar order_with_respect_to
efter din första migrate
.
beställning
¶
- Options.ordering¶
Standardordningen för objektet, för användning vid hämtning av listor över objekt:
ordering = ["-order_date"]
Detta är en tupel eller lista med strängar och/eller frågeuttryck. Varje sträng är ett fältnamn med ett valfritt prefix ”-”, som anger fallande ordning. Fält utan ett inledande ”-” ordnas i stigande ordning. Använd strängen ”?” för slumpmässig ordning.
Om du t.ex. vill sortera fältet
pub_date
i stigande ordning använder du följande:ordering = ["pub_date"]
För att beställa efter
pub_date
i fallande ordning, använd detta:ordering = ["-pub_date"]
För att beställa efter
pub_date
i fallande ordning, sedan efterauthor
i stigande ordning, använd detta:ordering = ["-pub_date", "author"]
Du kan också använda frågeuttryck. För att sortera efter
author
stigande och få null-värden att sorteras sist, använd detta:from django.db.models import F ordering = [F("author").asc(nulls_last=True)]
Varning
Beställning är inte en gratis operation. Varje fält som du lägger till i beställningen medför en kostnad för din databas. Varje främmande nyckel som du lägger till kommer implicit att inkludera alla sina standardbeställningar också.
Om en fråga inte har någon angiven ordning returneras resultaten från databasen i en ospecificerad ordning. En viss ordning garanteras endast när ordningen görs med hjälp av en uppsättning fält som unikt identifierar varje objekt i resultatet. Om t.ex. fältet name
inte är unikt garanterar inte beställningen efter det att objekt med samma namn alltid visas i samma ordning.
behörigheter
¶
- Options.permissions¶
Extra behörigheter som ska anges i behörighetstabellen när du skapar det här objektet. Behörigheter för att lägga till, ändra, ta bort och visa skapas automatiskt för varje modell. I det här exemplet anges en extra behörighet,
can_deliver_pizzas
:permissions = [("can_deliver_pizzas", "Can deliver pizzas")]
Detta är en lista eller tupel av 2-tuplar i formatet
(permission_code, human_readable_permission_name)
.
standard_behörigheter
¶
- Options.default_permissions¶
Standardvärdet är
('add', 'change', 'delete', 'view')
. Du kan anpassa den här listan, till exempel genom att ange en tom lista om din app inte kräver någon av standardbehörigheterna. Den måste anges för modellen innan modellen skapas avmigrate
för att förhindra att utelämnade behörigheter skapas.
proxy
¶
- Options.proxy¶
Om
proxy = True
, kommer en modell som subklassar en annan modell att behandlas som en :ref:proxymodell <proxy-models>
.
krävda_db_funktioner
¶
- Options.required_db_features¶
Lista över databasfunktioner som den aktuella anslutningen bör ha så att modellen beaktas under migreringsfasen. Om du t.ex. anger
['gis_enabled']
i den här listan kommer modellen endast att synkroniseras med GIS-aktiverade databaser. Det är också bra att hoppa över vissa modeller när du testar med flera databasbackends. Undvik relationer mellan modeller som kanske eller kanske inte skapas eftersom ORM inte hanterar detta.
krävd_db_leverantör
¶
- Options.required_db_vendor¶
Namn på en databasleverantör som stöds och som denna modell är specifik för. Aktuella inbyggda leverantörsnamn är:
`sqlite
,postgresql
,mysql
,oracle
. Om detta attribut inte är tomt och den aktuella anslutningsleverantören inte matchar det, kommer modellen inte att synkroniseras.
Välj_vid_sparande
¶
- Options.select_on_save¶
Bestämmer om Django ska använda pre-1.6
django.db.models.Model.save()
-algoritmen. Den gamla algoritmen använderSELECT
för att avgöra om det finns en befintlig rad som ska uppdateras. Den nya algoritmen försöker med enUPDATE
direkt. I vissa sällsynta fall ärUPDATE
av en befintlig rad inte synlig för Django. Ett exempel är PostgreSQLON UPDATE
trigger som returnerarNULL
. I sådana fall kommer den nya algoritmen att sluta göra enINSERT
även när en rad finns i databasen.Vanligtvis finns det inget behov av att ställa in detta attribut. Standardvärdet är
False
.Se
django.db.models.Model.save()
för mer information om den gamla och nya sparalgoritmen.
index
¶
- Options.indexes¶
En lista över index som du vill definiera på modellen:
from django.db import models class Customer(models.Model): first_name = models.CharField(max_length=100) last_name = models.CharField(max_length=100) class Meta: indexes = [ models.Index(fields=["last_name", "first_name"]), models.Index(fields=["first_name"], name="first_name_idx"), ]
unique_together
¶
- Options.unique_together¶
Uppsättningar av fältnamn som tillsammans måste vara unika:
unique_together = [["driver", "restaurant"]]
Detta är en lista över listor som måste vara unika när de betraktas tillsammans. Den används i Django-administratören och verkställs på databasnivå (dvs. lämpliga
UNIQUE
-satser ingår iCREATE TABLE
-satsen).För enkelhetens skull kan
unique_together
vara en enda lista när det handlar om en enda uppsättning fält:unique_together = ["driver", "restaurant"]
En
ManyToManyField
kan inte inkluderas iunique_together
. (Det är inte klart vad det ens skulle betyda!) Om du behöver validera unikhet relaterad till enManyToManyField
, försök använda en signal eller en explicitthrough
modell.Det
ValidationError
som uppstår vid modellvalidering när villkoret överträds har felkodenunique_together
.
begränsningar
¶
- Options.constraints¶
En lista över begränsningar som du vill definiera på modellen:
from django.db import models class Customer(models.Model): age = models.IntegerField() class Meta: constraints = [ models.CheckConstraint(condition=models.Q(age__gte=18), name="age_gte_18"), ]
verbose_namn
¶
- Options.verbose_name¶
Ett mänskligt läsbart namn för objektet, singular:
verbose_name = "pizza"
Om detta inte anges kommer Django att använda en sammansatt version av klassnamnet:
CamelCase
blircamel case
.
verbose_namn_plural
¶
- Options.verbose_name_plural¶
Det plurala namnet för objektet:
verbose_name_plural = "stories"
Om detta inte anges kommer Django att använda
verbose_name
+"s"
.
Skrivskyddade Meta
-attribut¶
etikett
¶
- Options.label¶
Representation av objektet, returnerar
app_label.object_name
, t.ex.'polls.Question'
.
etikett_nedre
¶
- Options.label_lower¶
Representation av modellen, returnerar
app_label.model_name
, t.ex.'polls.question'
.