Skip to content

djangodocs

Django 6.0
  • 6.1 current
  • 6.0
  • 5.2 LTS
Svenska
  • English
  • Svenska
  • 简体中文
  • Gaeilge
  • Français
  • 日本語
  • Bahasa Indonesia
  • Italiano
  • Português (Brasil)
  • 한국어
  • Español
  • Ελληνικά
  • Polski
Documentation contents
  • Dokumentation för Django
  • Kom igång
  • Använda Django
  • Hur man gör-guider
  • Vanliga frågor om Django
  • API-referens
    • Applikationer
    • Ramverk för systemkontroll
    • Inbyggt API för klassbaserade vyer
    • Skydd mot klickjacking
    • contrib paket
    • Content Security Policy
    • Skydd mot Cross Site Request Forgery
    • Databaser
    • django-admin och manage.py
    • Django Undantag
    • Filhantering
    • Formulär
    • Loggning
    • Middleware
    • Migrationsverksamhet
    • Modeller
      • Referens till modellfält
      • Referens till modellindex
      • Referens för begränsningar
      • Modell _meta API
      • Relaterade objekt referens
      • Referens till modellklass
      • Alternativ för modell Meta
      • Referens till modellinstans
      • aPI-referens för QuerySet
      • API-referens för uppslagning
      • Frågeuttryck
      • Villkorliga uttryck
      • Databasfunktioner
    • Paginator
    • Objekt för begäran och svar
    • SchemaEditor
    • Inställningar
    • Signaler
    • Tasks
    • Mallar
    • TemplateResponse och SimpleTemplateResponse
    • Unicode-data
    • django.urls verktygsfunktioner
    • django.urls funktioner för användning i URLconfs
    • Django Verktyg
    • Validerare
    • Inbyggda vyer
  • Metadokumentation och diverse
  • Ordlista
  • Versionsinformation
  • Djangos interna funktioner
Swedish translation. Contributed by the Django community. 99.9% Help translate
  1. Django 6.0
  2. API-referens
  3. Modeller

Relaterade objekt referensLink to this heading#

class RelatedManagerLink to this definition#

En ”relaterad manager” är en manager som används i ett relaterat sammanhang en-till-många eller många-till-många. Detta sker i två fall:

  • Den ”andra sidan” av en ForeignKey-relation. Det vill säga:

    Code
    from django.db import models
    
    
    class Blog(models.Model):
        # ...
        pass
    
    
    class Entry(models.Model):
        blog = models.ForeignKey(Blog, on_delete=models.CASCADE, null=True)
    

    I exemplet ovan kommer metoderna nedan att vara tillgängliga för förvaltaren blog.entry_set.

  • Båda sidor av en ManyToManyField relation

    Code
    class Topping(models.Model):
        # ...
        pass
    
    
    class Pizza(models.Model):
        toppings = models.ManyToManyField(Topping)
    

    I det här exemplet kommer metoderna nedan att vara tillgängliga både på topping.pizza_set och på pizza.toppings.

add(*objs, bulk=True, through_defaults=None)Link to this definition#
aadd(*objs, bulk=True, through_defaults=None)Link to this definition#

Asynkron version: aadd

Lägger till de angivna modellobjekten i den relaterade objektuppsättningen.

Exempel:

Python console
>>> b = Blog.objects.get(id=1)
>>> e = Entry.objects.get(id=234)
>>> b.entry_set.add(e)  # Associates Entry e with Blog b.

I exemplet ovan, när det gäller en ForeignKey-relation, används QuerySet.update() för att utföra uppdateringen. Detta kräver att objekten redan är sparade.

Du kan använda argumentet bulk=False för att istället låta den relaterade hanteraren utföra uppdateringen genom att anropa e.save().

Om du använder add() med en many-to-many-relation kommer dock inga save()-metoder att anropas (argumentet bulk finns inte), utan relationerna skapas med QuerySet.bulk_create(). Om du behöver köra någon anpassad logik när en relation skapas, lyssna på m2m_changed-signalen, som kommer att utlösa pre_add och post_add-åtgärder.

Om du använder add() på en relation som redan finns kommer relationen inte att dupliceras, men den kommer fortfarande att utlösa signaler.

För många-till-många-relationer accepterar add() antingen modellinstanser eller fältvärden, normalt primärnycklar, som argumentet *objs.

Använd argumentet through_defaults för att ange värden för den nya intermediate model-instansen (instanserna), om det behövs. Du kan använda callables som värden i ordlistan through_defaults och de kommer att utvärderas en gång innan någon eller några mellanliggande instanser skapas.

create(through_defaults=None, **kwargs)Link to this definition#
acreate(through_defaults=None, **kwargs)Link to this definition#

Asynkron version: acreate

Skapar ett nytt objekt, sparar det och lägger till det i den relaterade objektuppsättningen. Returnerar det nyskapade objektet:

Python console
>>> b = Blog.objects.get(id=1)
>>> e = b.entry_set.create(
...     headline="Hello", body_text="Hi", pub_date=datetime.date(2005, 1, 1)
... )

# No need to call e.save() at this point -- it's already been saved.

Detta är likvärdigt med (men enklare än):

Python console
>>> b = Blog.objects.get(id=1)
>>> e = Entry(blog=b, headline="Hello", body_text="Hi", pub_date=datetime.date(2005, 1, 1))
>>> e.save(force_insert=True)

Observera att det inte finns något behov av att ange nyckelordsargumentet för den modell som definierar relationen. I exemplet ovan skickar vi inte parametern blog till create(). Django räknar ut att det nya Entry-objektets blog-fält ska sättas till b.

Använd argumentet through_defaults för att ange värden för den nya instansen intermediate model, om det behövs. Du kan använda callables som värden i ordlistan through_defaults.

remove(*objs, bulk=True)Link to this definition#
aremove(*objs, bulk=True)Link to this definition#

Asynkron version: aremove

Tar bort de angivna modellobjekten från den relaterade objektuppsättningen:

Python console
>>> b = Blog.objects.get(id=1)
>>> e = Entry.objects.get(id=234)
>>> b.entry_set.remove(e)  # Disassociates Entry e from Blog b.

Similar to add(), e.save() is called in the example above to perform the update. Using remove() with a many-to-many relationship, however, will delete the relationships using QuerySet.delete() which means no model save() methods are called; listen to the m2m_changed signal if you wish to execute custom code when a relationship is deleted.

För många-till-många-relationer accepterar remove() antingen modellinstanser eller fältvärden, normalt primärnycklar, som argumentet *objs.

För ForeignKey-objekt finns denna metod endast om null=True. Om det relaterade fältet inte kan sättas till None (NULL), kan ett objekt inte tas bort från en relation utan att läggas till i en annan. I exemplet ovan är att ta bort e från b.entry_set() likvärdigt med att göra e.blog = None, och eftersom blog ForeignKey inte har null=True är detta ogiltigt.

För ForeignKey-objekt accepterar denna metod ett bulk-argument för att styra hur operationen ska utföras. Om True (standard) används QuerySet.update(). Om bulk=False anropas istället metoden save() för varje enskild modellinstans. Detta utlöser signalerna pre_save och post_save och sker på bekostnad av prestanda.

För många-till-många-relationer finns inte nyckelordsargumentet bulk.

clear(bulk=True)Link to this definition#
aclear(bulk=True)Link to this definition#

Asynkron version: aclear

Tar bort alla objekt från den relaterade objektuppsättningen:

Python console
>>> b = Blog.objects.get(id=1)
>>> b.entry_set.clear()

Observera att detta inte raderar de relaterade objekten - de kopplas bara isär.

Precis som remove() är clear() endast tillgänglig på ForeignKey` där null=True och den accepterar också nyckelordsargumentet bulk.

För många-till-många-relationer finns inte nyckelordsargumentet bulk.

set(objs, bulk=True, clear=False, through_defaults=None)Link to this definition#
aset(objs, bulk=True, clear=False, through_defaults=None)Link to this definition#

Asynkron version: aset

Byt ut uppsättningen av relaterade objekt:

Python console
>>> new_list = [obj1, obj2, obj3]
>>> e.related_set.set(new_list)

Denna metod accepterar ett clear-argument för att styra hur operationen ska utföras. Om False (standard), tas de element som saknas i den nya uppsättningen bort med remove() och endast de nya läggs till. Om clear=True anropas istället metoden clear() och hela uppsättningen läggs till på en gång.

För ForeignKey-objekt skickas bulk-argumentet vidare till add() och remove().

För många-till-många-relationer finns inte nyckelordsargumentet bulk.

Observera att eftersom set() är en sammansatt operation kan den vara föremål för tävlingsvillkor. Exempelvis kan nya objekt läggas till i databasen mellan anropet till clear() och anropet till add().

För många-till-många-relationer accepterar set() en lista med antingen modellinstanser eller fältvärden, normalt primärnycklar, som objs-argument.

Använd argumentet through_defaults för att ange värden för den nya intermediate model-instansen (instanserna), om det behövs. Du kan använda callables som värden i ordlistan through_defaults och de kommer att utvärderas en gång innan någon eller några mellanliggande instanser skapas.

Observera

Observera att add(), aadd(), create(), acreate(), remove(), aremove(), clear(), aclear(), set() och aset() alla tillämpar databasändringar omedelbart för alla typer av relaterade fält. Med andra ord behöver du inte anropa save()/asave()` i någon av ändarna av relationen.

Om du använder prefetch_related(), rensar metoderna add(), aadd(), remove(), aremove(), clear(), aclear(), set() och aset() den prefetchade cachen.

This page as Markdown JSON

Edit this page on GitHub Official version

PreviousModell _meta API NextReferens till modellklass

An unofficial rendering of the Django documentation.

Not affiliated with or endorsed by the Django Software Foundation. The documentation is copyright © Django Software Foundation and individual contributors, and is used under the BSD 3-Clause licence. “Django” is a trademark of the Django Software Foundation.

This translation is the work of the Django i18n community, not of this site. Read the official documentation at docs.djangoproject.com.

👋 Jason Cartwright