FixturerLink to this heading

En fixture är en samling filer som innehåller det serialiserade innehållet i databasen. Varje fixtur har ett unikt namn och filerna som fixturen består av kan distribueras över flera kataloger i flera applikationer.

Hur man tillverkar en fixturLink to this heading

Fixturer kan genereras med manage.py dumpdata. Det är också möjligt att generera anpassade fixturer genom att direkt använda serialiseringsverktyg eller till och med genom att skriva dem för hand.

Hur man använder en fixturLink to this heading

Fixturer kan användas för att i förväg fylla på databasen med data för tester:

Python
class MyTestCase(TestCase):
    fixtures = ["fixture-label"]

eller för att tillhandahålla några initial data med kommandot loaddata:

Shell
django-admin loaddata <fixture label>

Hur fixturer upptäcksLink to this heading

Django kommer att söka efter fixturer på dessa platser:

  1. I katalogen fixtures för varje installerad applikation

  2. I en katalog som anges i inställningen FIXTURE_DIRS

  3. I den bokstavliga sökvägen som anges av fixturen

Django kommer att ladda alla fixturer som den hittar på dessa platser och som matchar de angivna fixturnamnen. Om den namngivna fixturen har ett filtillägg kommer endast fixturer av den typen att laddas. Till exempel:

Shell
django-admin loaddata mydata.json

skulle bara ladda JSON-fixturer som heter mydata. Fixturtillägget måste motsvara det registrerade namnet på en serializer (t.ex. json eller xml).

Om du utelämnar tilläggen kommer Django att söka efter en matchande fixtur i alla tillgängliga fixturtyper. Till exempel:

Shell
django-admin loaddata mydata

letar efter alla fixturer av alla fixturtyper som heter mydata. Om en fixturkatalog innehåller mydata.json laddas den fixturen som en JSON-fixtur.

De namngivna fixturerna kan innehålla katalogkomponenter. Dessa kataloger kommer att inkluderas i sökvägen. Ett exempel:

Shell
django-admin loaddata foo/bar/mydata.json

söker efter <app_label>/fixtures/foo/bar/mydata.json för varje installerat program, <dirname>/foo/bar/mydata.json för varje katalog i FIXTURE_DIRS, och den bokstavliga sökvägen foo/bar/mydata.json.

Lastningsordning för fixturerLink to this heading

Flera fixturer kan anges i samma anrop. Till exempel:

Shell
django-admin loaddata mammals birds insects

eller i en testfallsklass:

Python
class AnimalTestCase(TestCase):
    fixtures = ["mammals", "birds", "insects"]

Den ordning i vilken fixturerna laddas följer den ordning i vilken de listas, oavsett om det är när du använder management-kommandot eller när du listar dem i testfallsklassen enligt ovan.

I dessa exempel laddas först alla fixturer med namnet mammals från alla program (i den ordning som programmen definieras i INSTALLED_APPS). Därefter laddas alla fixturer med namnet fåglar, följt av alla fixturer med namnet insekter.

Tänk på att om databasens backend stöder begränsningar på radnivå kommer dessa begränsningar att kontrolleras i slutet av transaktionen. Alla relationer över fixturer kan resultera i ett laddningsfel om databaskonfigurationen inte stöder uppskjuten begränsningskontroll (se MySQL-dokumenten för ett exempel).

Hur fixturer sparas i databasenLink to this heading

När fixturfiler bearbetas sparas data i databasen som de är. Modelldefinierade save()-metoder anropas inte, och alla pre_save- eller post_save-signaler anropas med raw=True eftersom instansen endast innehåller attribut som är lokala för modellen. Du kan till exempel vilja inaktivera hanterare som kommer åt relaterade fält som inte finns under fixturladdning och som annars skulle ge upphov till ett undantag:

Code
from django.db.models.signals import post_save
from .models import MyModel


def my_handler(**kwargs):
    # disable the handler during fixture loading
    if kwargs["raw"]:
        return
    ...


post_save.connect(my_handler, sender=MyModel)

Du kan också skriva en dekorator för att kapsla in denna logik:

Code
from functools import wraps


def disable_for_loaddata(signal_handler):
    """
    Decorator that turns off signal handlers when loading fixture data.
    """

    @wraps(signal_handler)
    def wrapper(*args, **kwargs):
        if kwargs["raw"]:
            return
        signal_handler(*args, **kwargs)

    return wrapper


@disable_for_loaddata
def my_handler(**kwargs): ...

Tänk bara på att den här logiken kommer att inaktivera signalerna när fixturerna deserialiseras, inte bara under loaddata.

Komprimerade armaturerLink to this heading

Fixturer kan komprimeras i formaten zip, gz, bz2, lzma eller xz. Till exempel:

Shell
django-admin loaddata mydata.json

letar efter något av följande: mydata.json, mydata.json.zip, mydata.json.gz, mydata.json.bz2, mydata.json.lzma eller mydata.json.xz. Den första filen i ett komprimerat arkiv används.

Observera att om två fixturer med samma namn men olika fixturtyp upptäcks (t.ex. om mydata.json och mydata.xml.gz hittades i samma fixturkatalog), kommer fixturinstallationen att avbrytas och alla data som installerats i anropet till loaddata kommer att tas bort från databasen.

Databasspecifika fixturerLink to this heading

Om du har flera databaser kan det hända att du har fixturdata som du vill ladda i en databas, men inte i en annan. I den här situationen kan du lägga till en databasidentifierare i namnen på dina fixturer.

Om inställningen DATABASER till exempel har en databas med namnet users definierad, namnge fixturen mydata.users.json eller mydata.users.json.gz och fixturen laddas endast när du anger att du vill ladda data till databasen users.