SamhlaLink to this heading

Is é samhail an fhoinse aonair, cinntitheach faisnéise faoi do shonraí. Tá réimsí agus iompraíochtaí riachtanacha ann na sonraí atá á stóráil agat. Go ginearálta, déanann gach samhail mapáil chuig tábla bunachar sonraí amháin.

Na buneilimintí:

  • Is aicme Python é gach samhail a fho-aicmi:class: Django.db.Models.Model.

  • Léiríonn gach tréith den tsamhail réimse bunachar sonraí.

  • Leis seo go léir, tugann Django API rochtana bunachar sonraí a ghintear go huathoibríoch duit; féach: doc: /topics/db/queries.

Sampla tapaLink to this heading

Sainmhíníonn an tsamhail sampla seo Person, a bhfuil chéad_ainm agus ainm_deiride aige:

Code
from django.db import models


class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

Is réimsí den tsamhail iad chéad_ainm agus ``ainm_deiridh ``. Sonraítear gach réimse mar thréith aicme, agus léarscálann gach tréith chuig colún bunachar sonraí.

Chruthódh an tsamhail “Duine” thuas tábla bunachar sonraí mar seo:

SQL
CREATE TABLE myapp_person (
    "id" bigint NOT NULL PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    "first_name" varchar(30) NOT NULL,
    "last_name" varchar(30) NOT NULL
);

Roinnt nótaí teicniúla:

  • Díorthaítear ainm an tábla, myapp_person`, go huathoibríoch ó roinnt meiteashonraí samhail ach is féidir é a shárú. Féach: Ref: table-names le haghaidh tuilleadh sonraí.

  • Cuirtear réimse `id ``leis go huathoibríoch, ach is féidir an t-iompar seo a shárú. Féach: tagairt: `uathoibrí-phríomh-eochair-réimsí `.

  • Tá an SQL CREATE TABLE` sa sampla seo formáidithe ag baint úsáide as comhréiteach PostgreSQL, ach is fiú a thabhairt faoi deara go n-úsáideann Django SQL atá curtha in oiriúint don chúlcheann bunachar sonraí a shonraítear i do: doc: `comhad </topics/settings> socruithe `.

Múnlaí a úsáidLink to this heading

Nuair a bheidh do mhúnlaí sainmhínithe agat, ní mór duit a rá le Django go bhfuil tú chun * úsáid* na samhlacha sin. Déan é seo trí do chomhad socruithe a chur in eagar agus an socrú:setting: INSTALLED_APPS a athrú chun ainm an mhodúil ina bhfuil do models.py` a chur leis.

<startapp>Mar shampla, má tá na samhlacha d'iarratais ina gcónaí sa mhodúl myapp.models (struchtúr an phacáiste a chruthaítear d'iarratas leis an scripte:djadmin: manage.py startapp `), ba chóir :setting: `INSTALLED_APPS léamh, go páirteach:

Code
INSTALLED_APPS = [
    # ...
    "myapp",
    # ...
]

<migrate><makemigrations>Nuair a chuireann tú aipeanna nua chuig: setting: INSTALLED_APPS, bí cinnte rith: djadmin: manage.py migration `, ag déanamh imirce dóibh go roghnach le: djadmin: `manage.py makemigrations.

RéimsíLink to this heading

Is é an chuid is tábhachtaí de mhúnla - agus an t-aon chuid riachtanach de mhúnla - liosta na réimsí bunachar sonraí a shainmhíníonn sé. Sonraítear réimsí de réir tréithe ranga. Bí cúramach gan ainmneacha réimse a roghnú atá ag teacht ar choinníoll leis na:doc: models API cosúil le glan ``, `shábháil </ref/models/instances>, nó scrios.

Sampla:

Code
from django.db import models


class Musician(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    instrument = models.CharField(max_length=100)


class Album(models.Model):
    artist = models.ForeignKey(Musician, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    release_date = models.DateField()
    num_stars = models.IntegerField()

Cineálacha réimseLink to this heading

Ba chóir go mbeadh gach réimse i do mhúnla mar shampla den rang oiriúna:class: ~Django.db.Models.Field. Úsáideann Django na cineálacha ranga allamuigh chun cúpla rud a chinneadh:

  • An cineál colún, a insíonn don bhunachar sonraí cén cineál sonraí atá le stóráil (m.sh. INTEGER, VARCHAR`, TEXT`).

  • </ref/forms/widgets> <input type="text"><select>An réamhshocraithe HTML:doc: giuirléid le húsáid agus réimse foirme á rindreáil (m.sh. , , ``).

  • Na ceanglais bailíochtaithe íosta, a úsáidtear i riarachán Django agus i bhfoirmeacha a ghintear go huathoibríoch.

<model-field-types>Loingíonn Django le mórán cineálacha réimse ionsuite; is féidir leat an liosta iomlán a fháil in:ref: tagairt réimse samhail `. Is féidir leat do réimsí féin a scríobh go héasca mura ndéanann cinn ionsuite Django an cleas; féach: doc: `/howto/custom-model-fields.

Roghanna réimseLink to this heading

<model-field-types>Glacann gach réimse sraith áirithe d'argóintí réimsiúnacha (doiciméadaithe in:ref: tagairt réimse samhail `). Mar shampla, éilíonn :class: `~django.db.models.charfield (agus a fho-aicmí) a:attr: ~django.db.models.charfield.max_Length argóint a shonraíonn méid an réimse bunachar sonraí VARCHAR a úsáidtear chun na sonraí a stóráil.

Tá sraith argóintí coitianta ar fáil do gach cineál réimse freisin. Tá gach ceann roghnach. Mínítear iad go hiomlán in:ref: tagairt <common-model-field-options>, ach seo achoimre tapa ar na cinn is minice a úsáidtear:

null

Má tá True, stóráilfidh Django luachanna folmha mar NULL sa bhunachar sonraí. Is é “False” réamhshocraithe.

blank

Má tá “Fíor”, ceadaítear don réimse a bheith bán. Is é “False” réamhshocraithe.

Tabhair faoi deara go bhfuil sé seo difriúil ná: attr: ~Field.null. :attr: ~Field.null a bhaineann le bunachar sonraí amháin, áit a bhaineann le bailíochtú: attr: ~Field.blank. Má tá réimse ag: attr: Blank=true <Field.blank>, ceadóidh bailíochtú foirm luach folamh a iontráil. Má tá réimse ag: attr: Blank=false <Field.blank>, beidh an réimse ag teastáil.

choices

A: Téarma: seicheamh de thúpaí 2-luach, a: term: maping, an:ref: cineál áireamha, nó inghlaonta (nach bhfuil súil ag aon argóintí agus a thugann <field-choices-enum-types>aon cheann de na formáidí roimhe seo ar ais), le húsáid mar roghanna don réimse seo. Má thugtar é seo, is bosca roghnaithe é an giuirléid fhoirme réamhshocraithe in ionad an réimse téacs caighdeánach agus teorannfaidh sé roghanna leis na roghanna a thugtar.

Breathnaíonn liosta roghanna mar seo:

Code
YEAR_IN_SCHOOL_CHOICES = [
    ("FR", "Freshman"),
    ("SO", "Sophomore"),
    ("JR", "Junior"),
    ("SR", "Senior"),
    ("GR", "Graduate"),
]

Is é an chéad ghné i ngach tuple an luach a stóráilfear sa bhunachar sonraí. Taispeántar an dara gné ag giuirléid fhoirme an réimse.

Mar gheall ar shampla samhail, is féidir rochtain a fháil ar an luach taispeána do réimse le roghnaí ag baint úsáide as an modh: meth: ~django.db.models.model.get_foo_display. Mar shampla:

Code
from django.db import models


class Person(models.Model):
    SHIRT_SIZES = {
        "S": "Small",
        "M": "Medium",
        "L": "Large",
    }
    name = models.CharField(max_length=60)
    shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
Python console
>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'

Is féidir leat ranganna áireamh a úsáid freisin chun “roghanna” a shainiú ar bhealach gonta:

Code
from django.db import models


class Runner(models.Model):
    MedalType = models.TextChoices("MedalType", "GOLD SILVER BRONZE")
    name = models.CharField(max_length=60)
    medal = models.CharField(blank=True, choices=MedalType, max_length=10)

<field-choices>Tá samplaí breise ar fáil in:ref: `tagairt réimse samhail `.

default

An luach réamhshocraithe don réimse. Is féidir leis seo a bheith ina luach nó ina réad inghlaonta. Má tá sé inghlaoch, glaofar air gach uair a chruthaítear réad nua.

db_default

An luach réamhshocraithe ríofa bunachar sonraí don réimse. Is féidir leis seo a bheith ina luach litriúil nó ina fheidhm bunachar sonraí.

Má tá db_default` agus:attr: Field.default araon socraithe, tabharfaidh default tosaíocht agus cásanna á chruthú i gcód Python. Socrófar db_default fós ag leibhéal an bhunachar sonraí agus úsáidfear é agus sraitheanna á chur isteach lasmuigh den ORM nó nuair a chuirtear réimse nua i imirce.

help_text

Téacs breise “cabhrach” le taispeáint leis an ngiuirléid fhoirme. Tá sé úsáideach le haghaidh doiciméadú fiú mura n-úsáidtear do réimse ar fhoirm.

primary_key

Má tá True, is é an réimse seo an príomh-eochair don tsamhail.

If you don't specify primary_key=True for any fields in your model, Django will automatically add a field to hold the primary key, so you don't need to set primary_key=True on any of your fields unless you want to override the default primary-key behavior. For more, see Príomhréimsí uathoibríoch.

Tá an príomhréimse léite amháin. Má athraíonn tú luach an phríomh-eochair ar réad atá ann cheana agus ansin é a shábháil, cruthófar réad nua in éineacht leis an seancheann. Mar shampla:

Code
from django.db import models


class Fruit(models.Model):
    name = models.CharField(max_length=100, primary_key=True)
Python console
>>> fruit = Fruit.objects.create(name="Apple")
>>> fruit.name = "Pear"
>>> fruit.save()
>>> Fruit.objects.values_list("name", flat=True)
<QuerySet ['Apple', 'Pear']>
unique

Má tá “Fíor”, caithfidh an réimse seo a bheith uathúil ar fud an tábla.

Arís, níl iad seo ach tuairiscí gairid ar na roghanna réimse is coitianta. <common-model-field-options>Is féidir sonraí iomlána a fháil in:ref: `tagairt rogha réimse samhail choiteann `.

Príomhréimsí uathoibríochLink to this heading

<django.apps.AppConfig.default_auto_field>De réir réamhshocraithe, tugann Django eochair phríomh-mhéadaithe uathoibríoch do gach samhail leis an gcineál a shonraítear in aghaidh an aip in:attr: appconfig.default_AUTO_FIELD nó ar fud an domhain sa socrú:: DEFAULT_AUTO_FIELD. Mar shampla:

Code
id = models.BigAutoField(primary_key=True)

<Field.primary_key>Más mian leat eochair phríomhúil saincheaptha a shonrú, sonraigh: attr: primary_key=True `ar cheann de do réimsí. Má fheiceann Django go bhfuil tú socraithe go sainráite: attr: `Field.primary_key, ní chuirfidh sé an colún id` uathoibríoch leis.

Éilíonn gach samhail réimse amháin go díreach: attr: `primary_key=True <Field.primary_key>`(dearbhaithe go sainráite nó cuireadh leis go huathoibríoch).

Ainmneacha réimse VerboseLink to this heading

Glacann gach cineál réimse, ach amháin dó:class: ~django.db.models.foreignKey, :class: ~django.db.models.manyToManyField agus:class: ~django.db.models.onetoonefield, argóint roghnach an chéad phoist - ainm fhíorúil. Mura dtugtar an t-ainm fhíorúil, cruthóidh Django é go huathoibríoch ag baint úsáide as ainm tréith an réimse, ag athrú béim go spásanna.

Sa sampla seo, is é ``"céadainm an duine” ``an t-ainm fhíoróideach:

Code
first_name = models.CharField("person's first name", max_length=30)

Sa sampla seo, is é "céadainm" an t-ainm eolach:

Code
first_name = models.CharField(max_length=30)

ForeignKey, ManyToManyField and OneToOneField require the first argument to be a model class, so use the verbose_name keyword argument:

Code
poll = models.ForeignKey(
    Poll,
    on_delete=models.CASCADE,
    verbose_name="the related poll",
)
sites = models.ManyToManyField(Site, verbose_name="list of sites")
place = models.OneToOneField(
    Place,
    on_delete=models.CASCADE,
    verbose_name="related place",
)

Ní hé an coinbhinsiún chun an chéad litir den: attr: ~field.verbose_name a chaipitliú. Déanfaidh Django caipitliú go huathoibríoch an chéad litir nuair is gá dó.

CaidrimhLink to this heading

Is léir go bhfuil cumhacht na mbunachar sonraí coibhneasta ná táblaí a bhaineann lena chéile. Cuireann Django bealaí ar fáil chun na trí chineál caidrimh bunachar sonraí is coitianta a shainiú: go leor le duine, go leor agus duine le duine.

Caidrimh go leor le duineLink to this heading

Chun caidreamh go leor le duine a shainiú, bain úsáid as: class: Django.db.Models.ForeignKey. Úsáideann tú é díreach cosúil le haon chineál eile: class: ~django.db.models.field: tríd é a áireamh mar thréith aicme de do mhúnla.

ForeignKey requires a positional argument: the class to which the model is related.

Mar shampla, má tá “Monaróir” ag samhail Carr` - is é sin, déanann ``Monaróir ``gluaisteáin iolracha ach níl ach ``Monaróir amháin ag gach ``Carr` - bain úsáid as na sainmhínithe seo a leanas:

Code
from django.db import models


class Manufacturer(models.Model):
    # ...
    pass


class Car(models.Model):
    manufacturer = models.ForeignKey(Manufacturer, on_delete=models.CASCADE)
    # ...

<ref-foreignkey>Is féidir leat freisin: ref: caidrimh athshlánacha <recursive-relationships>`a chruthú (réad a bhfuil caidreamh go leor le duine leis féin) agus:ref: `caidrimh le samhlacha nach bhfuil sainmhínithe fós; féach:ref: `tagairt réimse an tsamhail <lazy-relationships>`le haghaidh sonraí.

Moltar, ach ní gá, go mbeidh ainm a: class: ~Django.db.Models.ForeignKey réimse (``monaróir` sa sampla thuas) ainm an tsamhail, litreacha beaga. Is féidir leat glaoch ar an réimse cibé rud is mian leat. Mar shampla:

Code
class Car(models.Model):
    company_that_makes_it = models.ForeignKey(
        Manufacturer,
        on_delete=models.CASCADE,
    )
    # ...

Caidrimh go leorLink to this heading

Chun caidreamh go leor a shainiú, bain úsáid as: class: ~django.db.models.manyToManyField. Úsáideann tú é díreach cosúil le haon chineál eile: class: ~django.db.models.field: tríd é a áireamh mar thréith aicme de do mhúnla.

ManyToManyField requires a positional argument: the class to which the model is related.

Mar shampla, má tá rudaí iolracha `Topping ag Pizza` - is é sin, is féidir le Topping a bheith ar phíosaí iolracha agus go bhfuil iolracha barrachtaí ag gach Pizza - seo an chaoi a d'fhéadfá a léiriú sin:

Code
from django.db import models


class Topping(models.Model):
    # ...
    pass


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

<lazy-relationships>Mar atá le: class: ~django.db.Models.ForeignKey, is féidir leat a chruthú freisin: ref: caidrimh athshlánacha `(réad a bhfuil gaol go leor acu leis féin) agus:ref: `caidrimh le samhlacha nach bhfuil sainmhínithe fós<recursive-relationships>.

Moltar, ach ní gá, go mbeadh ainm a: class: ~django.db.models.manyToManyField (toppings sa sampla thuas) ina iolra ag cur síos ar an tsraith rudaí samhail gaolmhara.

Is cuma cén tsamhail aige: aicme: ~django.db.models.manyTomanyField, ach níor cheart duit é a chur ach i gceann de na samhlacha - ní an dá cheann.

Go ginearálta, ba chóir go rachaidh cásanna :class: ~django.db.models.manyToManyField isteach sa réad atá le cur in eagar ar fhoirm. Sa sampla thuas, tá toppings i Pizza` (seachas Topping a bhfuil pizzas``: class: ~django.db.Models.manyTomanyField) toisc go bhfuil sé níos nádúrtha smaoineamh ar pizza a bhfuil barráidí ann ná barráitigh a bheith ar phizza iolracha. An bealach a chuirtear ar bun thuas, ligfeadh an fhoirm ``Pizza ``d'úsáideoirí na toppings a roghnú.

<manytomany-arguments>Glacann réimsí: class: ~django.db.models.manyTomanyField le roinnt argóintí breise freisin a mhínítear in:ref: `tagairt réimse an tsamhail `. Cuidíonn na roghanna seo le sainmhíniú conas ba chóir don chaidreamh a bheith ag obair; tá gach

Réimsí breise ar chaidrimh go leorLink to this heading

Nuair nach bhfuil tú ag déileáil ach le caidrimh go leor cosúil le pizzí agus topping a mheascadh agus a mheaitseáil, is é caighdeán:class: ~django.db.models.manyTomanyField gach a theastaíonn uait. Mar sin féin, uaireanta b'fhéidir go mbeidh ort sonraí a cheangal leis an ngaol idir dhá mhúnla.

Mar shampla, smaoinigh ar chás feidhmchláir a rianú na grúpaí ceoil a mbaineann ceoltóirí leo. Tá caidreamh go leor idir duine agus na grúpaí a bhfuil siad ina bhall díobh, mar sin d'fhéadfá a:class: ~django.db.models.manyToManyField a úsáid chun an caidreamh seo a léiriú. Mar sin féin, tá go leor mionsonraí faoin bhballraíocht a d'fhéadfá a bhailiú, mar shampla an dáta ar tháinig an duine isteach sa ghrúpa.

Maidir leis na cásanna seo, tugann Django deis duit an tsamhail a úsáidfear a shonrú chun an caidreamh go leor a rialú. Ansin is féidir leat réimsí breise a chur ar an tsamhail idirmheánach. <ManyToManyField.through>Tá baint ag an tsamhail idirmheánach leis an:class: ~django.db.models.manyToManyField ag baint úsáide as an argóint:attr: `trí `chun cur in iúl don tsamhail a ghníomhóidh mar idirghabhálaí. Maidir lenár sampla ceoltóra, bheadh cuma mar seo ar an gcód:

Code
from django.db import models


class Person(models.Model):
    name = models.CharField(max_length=128)

    def __str__(self):
        return self.name


class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through="Membership")

    def __str__(self):
        return self.name


class Membership(models.Model):
    person = models.ForeignKey(Person, on_delete=models.CASCADE)
    group = models.ForeignKey(Group, on_delete=models.CASCADE)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

    class Meta:
        constraints = [
            models.UniqueConstraint(
                fields=["person", "group"], name="unique_person_group"
            )
        ]

Nuair a bhunaíonn tú an tsamhail idirghabhálaí, sonraíonn tú eochracha eachtracha go sainráite do na samhlacha a bhfuil baint acu leis an gcaidreamh go leor. Sainmhíníonn an dearbhú sainráite seo conas a bhaineann an dá mhúnla.

If you don't want multiple associations between the same instances, add a UniqueConstraint including the from and to fields. Django's automatically generated many-to-many tables include such a constraint.

Tá cúpla srianta ar an tsamhail idirmheánach:

  • <ManyToManyField.through_fields>Caithfidh eochair eachtrach amháin - agus * amháin - a bheith i do mhúnla idirmheánach don tsamhail fhoinse (“Grúpa” a bheadh seo inár sampla), nó ní mór duit na heochracha eachtracha ba chóir do Django a úsáid don chaidreamh a shonrú go sainráite ag baint úsáidea:attr: ManyTomanyField.through_fields `. Má tá níos mó ná eochair eachtrach amháin agat agus mura ndéantar `through_fields` a shonrú, ardófar earráid bailíochtaithe. Baineann srian den chineál céanna leis an eochair eachtrach don spriocmhúnla (ba é seo ``Duine ``inár sampla).

  • For a model which has a many-to-many relationship to itself through an intermediary model, two foreign keys to the same model are permitted, but they will be treated as the two (different) sides of the many-to-many relationship. If through_fields is not specified, the first foreign key will be taken to represent the source side of the ManyToManyField, while the second will be taken to represent the target side. If there are more than two foreign keys though, you must specify through_fields to explicitly indicate which foreign keys to use, otherwise a validation error will be raised.

Anois go bhfuil do: class: ~django.db.models.manyToManyField curtha ar bun agat chun do mhúnla idirghabhálaí a úsáid (``Ballraíocht ``, sa chás seo), tá tú réidh chun roinnt caidrimh go leor a chruthú. Déanann tú é seo trí chásanna den tsamhail idirmheánach a chruthú:

Python console
>>> ringo = Person.objects.create(name="Ringo Starr")
>>> paul = Person.objects.create(name="Paul McCartney")
>>> beatles = Group.objects.create(name="The Beatles")
>>> m1 = Membership(
...     person=ringo,
...     group=beatles,
...     date_joined=date(1962, 8, 16),
...     invite_reason="Needed a new drummer.",
... )
>>> m1.save()
>>> beatles.members.all()
<QuerySet [<Person: Ringo Starr>]>
>>> ringo.group_set.all()
<QuerySet [<Group: The Beatles>]>
>>> m2 = Membership.objects.create(
...     person=paul,
...     group=beatles,
...     date_joined=date(1960, 8, 1),
...     invite_reason="Wanted to form a band.",
... )
>>> beatles.members.all()
<QuerySet [<Person: Ringo Starr>, <Person: Paul McCartney>]>

Is féidir leat úsáid freisin:: ~Django.db.Models.Fields.Related.RelatedManager.Add, :meth: ~Django.db.Models.Fields.Related.RelatedManager.Create, nó:meth: ~Django.db.Models.Fields.Related.RelatedManager.set chun caidrimh a chruthú, chomh fada agus a shonraíonn tú `through_defaults le haghaidh aon réimsí riachtanacha:

Python console
>>> beatles.members.add(john, through_defaults={"date_joined": date(1960, 8, 1)})
>>> beatles.members.create(
...     name="George Harrison", through_defaults={"date_joined": date(1960, 8, 1)}
... )
>>> beatles.members.set(
...     [john, paul, ringo, george], through_defaults={"date_joined": date(1960, 8, 1)}
... )

B'fhéidir gur fearr leat cásanna den tsamhail idirmheánach a chruthú go díreach.

Mura gcuireann an tábla saincheaptha a shainmhíníonn an tsamhail idirmheánach uathúlacht i bhfeidhm ar an bpéire (samhail1, samhail2), ag ceadú illuachanna, bainfidh an glao:meth: ~django.db.Models.Fields.Related.RelatedManager.Remove gach cásanna samhail idirmheánach:

Python console
>>> Membership.objects.create(
...     person=ringo,
...     group=beatles,
...     date_joined=date(1968, 9, 4),
...     invite_reason="You've been gone for a month and we miss you.",
... )
>>> beatles.members.all()
<QuerySet [<Person: Ringo Starr>, <Person: Paul McCartney>, <Person: Ringo Starr>]>
>>> # This deletes both of the intermediate model instances for Ringo Starr
>>> beatles.members.remove(ringo)
>>> beatles.members.all()
<QuerySet [<Person: Paul McCartney>]>

Is féidir an modh: Meth: ~Django.db.Models.Fields.Related.RelatedManager.Clear a úsáid chun gach caidreamh go leor a bhaint mar shampla:

Python console
>>> # Beatles have broken up
>>> beatles.members.clear()
>>> # Note that this deletes the intermediate model instances
>>> Membership.objects.all()
<QuerySet []>

Nuair a bheidh na caidrimh go leor bunaithe agat, is féidir leat ceisteanna a eisiúint. Díreach mar a bhaineann le gnáthchaidrimh go leor, is féidir leat fiosrú a dhéanamh ag baint úsáide as tréithe an tsamhail a bhaineann le go leor:

Python console
# Find all the groups with a member whose name starts with 'Paul'
>>> Group.objects.filter(members__name__startswith="Paul")
<QuerySet [<Group: The Beatles>]>

Toisc go bhfuil samhail idirmheánach á úsáid agat, is féidir leat fiosrú a dhéanamh ar a thréithe freisin:

Python console
# Find all the members of the Beatles that joined after 1 Jan 1961
>>> Person.objects.filter(
...     group__name="The Beatles", membership__date_joined__gt=date(1961, 1, 1)
... )
<QuerySet [<Person: Ringo Starr]>

Más gá duit rochtain a fháil ar fhaisnéis ballraíochta féadfaidh tú é sin a dhéanamh trí cheist a dhéanamh go díreach ar an tsamhail ``Ballraíocht ``:

Python console
>>> ringos_membership = Membership.objects.get(group=beatles, person=ringo)
>>> ringos_membership.date_joined
datetime.date(1962, 8, 16)
>>> ringos_membership.invite_reason
'Needed a new drummer.'

<m2m-reverse-relationships>Bealach eile chun rochtain a fháil ar an bhfaisnéis chéanna ná trí:ref: caidreamh droch-go mór' a cheistiú ó réad ``Duine `:

Python console
>>> ringos_membership = ringo.membership_set.get(group=beatles)
>>> ringos_membership.date_joined
datetime.date(1962, 8, 16)
>>> ringos_membership.invite_reason
'Needed a new drummer.'

Caidrimh duine le duineLink to this heading

Chun caidreamh duine le duine a shainiú, bain úsáid as: class: ~Django.db.Models.OneToOneField. Úsáideann tú é díreach cosúil le haon chineál ``Field` eile: tríd é a áireamh mar thréith aicme de do mhúnla.

Tá sé seo is úsáideach ar phríomh-eochair réada nuair a “leathnaíonn” an réad sin réad eile ar bhealach éigin.

OneToOneField requires a positional argument: the class to which the model is related.

Mar shampla, dá mbeadh bunachar sonraí de “áiteanna” á tógáil agat, tógfá rudaí deas caighdeánach mar sheoladh, uimhir theileafóin, srl sa bhunachar sonraí. <model-inheritance>Ansin, dá dteastaíonn uait bunachar sonraí bialanna a thógáil ar bharr na n-áiteanna, in ionad tú féin a athdhéanamh agus na réimsí sin a mhacasamhlú sa tsamhail ``Bialain`, d'fhéadfá a chur ar `Bialann ``áit; i ndáiríre, chun é seo a láimhseáil bheadh úsáide:ref: “oidhreacht”, lena mbaineann caidreamh intuigthe duine le duine).

<recursive-relationships><lazy-relationships>Mar atá le: class: ~django.db.Models.ForeignKey, is féidir a:ref: caidreamh athshlánach `a shainiú agus is féidir: ref: `tagairtí do mhúnlaí neamhshainithe fós a dhéanamh.

Glacann réimsí: class: ~django.db.models.onetoonefield le argóint roghnaí:attr: ~django.db.models.onetoonefield.parent_link freisin.

OneToOneField classes used to automatically become the primary key on a model. This is no longer true (although you can manually pass in the primary_key argument if you like). Thus, it's now possible to have multiple fields of type OneToOneField on a single model.

Múnlaí ar fud comhaidLink to this heading

Tá sé go hiomlán ceart go leor samhail a cheangal le ceann amháin ó aip eile. Chun seo a dhéanamh, iompórtáil an tsamhail ghaolmhar ag barr an chomhaid ina bhfuil do mhúnla sainmhínithe. Ansin, déan tagairt don rang samhail eile cibé áit is gá. Mar shampla:

Code
from django.db import models
from geography.models import ZipCode


class Restaurant(models.Model):
    # ...
    zip_code = models.ForeignKey(
        ZipCode,
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
    )

Alternatively, you can use a lazy reference to the related model, specified as a string in the format "app_label.ModelName". This does not require the related model to be imported. For example:

Code
from django.db import models


class Restaurant(models.Model):
    # ...
    zip_code = models.ForeignKey(
        "geography.ZipCode",
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
    )

See lazy relationships for more details.

Srianta ainm réimseLink to this heading

Cuireann Django roinnt srianta ar ainmneacha réimse samhail:

  1. Ní féidir ainm réimse a bheith ina fhocal áirithe Python, toisc go mbeadh earráid comhréireachta Python mar thoradh air sin. Mar shampla:

    Text
    class Example(models.Model):
        pass = models.IntegerField() # 'pass' is a reserved word!
    
  2. Ní féidir níos mó ná béim amháin i ndiaidh a chéile i ainm réimse, mar gheall ar an mbealach a oibríonn comhréir cuardaigh ceisteanna Django. Mar shampla:

    Code
    class Example(models.Model):
        foo__bar = models.IntegerField()  # 'foo__bar' has two underscores!
    
  3. Ní féidir le hainm réimse deireadh a chur le béim, ar chúiseanna comhchosúla.

  4. A field name cannot be check, as this would override the check framework's Model.check() method.

Is féidir na teorainneacha seo a oibriú timpeall, áfach, toisc nach gá go gcaithfidh d'ainm réimse d'ainm colún bunachar sonraí a mheaitseáil. Féach an roghna:attr: ~Field.db_Column.

Ceadaítear focail fhorchoimeádta SQL, mar shampla join`, ``, ```nó ``roghnaigh, ** mar ainmneacha réimse samhail, toisc go n-éalaíonn Django gach ainm tábla bunachar sonraí agus ainmneacha colún i ngach ceist bhunúsach SQL. Úsáideann sé comhréir luachana d'inneall bunachar sonraí áirithe.

cineálacha réimse saincheapthaLink to this heading

Mura féidir ceann de na réimsí samhlacha atá ann cheana a úsáid chun do chuspóirí a fheistiú, nó más mian leat leas a bhaint as roinnt cineálacha colún bunachar sonraí nach bhfuil chomh coitianta, is féidir leat do rang réimse féin a chruthú. Cuirtear clúdach iomlán ar do réimsí féin a chruthú ar fáil in:doc: /howto/custom-model-fields.

Roghanna MetaLink to this heading

Tabhair meiteashonraí do mhúnla trí aicme Meta istigh a úsáid, mar sin:

Code
from django.db import models


class Ox(models.Model):
    horn_length = models.IntegerField()

    class Meta:
        ordering = ["horn_length"]
        verbose_name_plural = "oxen"

Is é meiteashonraí samhail “aon rud nach réimse”, mar shampla roghanna ordaithe (:attr: ~Options.Ordering), ainm tábla bunachar sonraí (:attr: ~Options.db_table), nó ainmneacha uaineacha agus iolra inléite don duine (:attr: ~Options.verbose_name_plural). Níl aon cheann de dhíth, agus tá sé go hiomlán roghnach ``aicme Meta ``a chur le samhail.

Is féidir liosta iomlán de na roghanna Meta` féideartha go léir a fháil in:doc: tagairt rogha samhail. </ref/models/options>

Tréithe samhailLink to this heading

`ruda

Is é an tréith is tábhachtaí de mhúnla ná: aicme: ~django.db.models.manager. Is é an comhéadan trína gcuirtear oibríochtaí fiosrúcháin bunachar sonraí ar fáil do mhúnlaí Django agus úsáidtear é chun: ref: na cásanna a aisghabháil ón mbunachar son <retrieving-objects>raí. Mura sainmhínítear ``Bainiste` saincheaptha, is é an t-ainm réamhshocraithe:attr: ~Django.db.Models.Model.Objects. Ní féidir bainisteoirí inrochtana ach trí ranganna samhail, ní na cásanna samhail.

Modhanna múnlaLink to this heading

Sainmhínigh modhanna saincheaptha ar mhúnla chun feidhmiúlacht saincheaptha “leibhéal sraithe” a chur le do chuid rudaí. Cá bhfuil: Class: ~Django.db.Models.Manager i gceist le modhanna rudaí “ar fud an tábla” a dhéanamh, ba cheart do mhodhanna samhail gníomhú ar shampla samhail áirithe.

Is teicníc luachmhar é seo chun loighic ghnó a choinneáil in aon áit amháin - an tsamhail.

Mar shampla, tá cúpla modh saincheaptha ag an tsamhail seo:

Code
from django.db import models


class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    birth_date = models.DateField()

    def baby_boomer_status(self):
        "Returns the person's baby-boomer status."
        import datetime

        if self.birth_date < datetime.date(1945, 8, 1):
            return "Pre-boomer"
        elif self.birth_date < datetime.date(1965, 1, 1):
            return "Baby boomer"
        else:
            return "Post-boomer"

    @property
    def full_name(self):
        "Returns the person's full name."
        return f"{self.first_name} {self.last_name}"

Is é an modh deireanach sa sampla seo a: téarma: `maoin `.

</ref/models/instances> <model-instance-methods>Tá liosta iomlán de:ref: modhanna a thugtar go huathoibríoch do gach samhail `sa tagairt samhail: Doc: `samhail tagair. Is féidir leat an chuid is mó díobh seo a shárú - féach `modhanna samhail réamhshainithe a shárú `_, thíos - ach tá lánúin ann a mbeidh tú ag iarraidh a shainiú beagnach i gcónaí:

: meth: ~ Múnla. __str__

“Modh draíochta” Python a thugann léiriú teaghrán ar aon rud ar ais. Seo a úsáidfidh Python agus Django aon uair is gá samhail samhail a iallú agus a thaispeáint mar shreang simplí. Go háirithe, tarlaíonn sé seo nuair a thaispeánann tú réad i gconsól idirghníomhach nó sa riarachán.

Beidh tú ag iarraidh an modh seo a shainiú i gcónaí; ní bhíonn an réamhshocrú an-chabhrach ar chor ar

get_absolute_url()

Insíonn sé seo do Django conas an URL do réad a ríomh. Úsáideann Django é seo ina chomhéadan riaracháin, agus am ar bith ní mór dó URL a fháil amach le haghaidh réad.

Ba cheart d'aon rud a bhfuil URL aige a aithníonn go uathúil é an modh seo a shainiú.

Modhanna samhail réamhshainithe a shárúLink to this heading

Tá sraith eile de:ref: modhanna samhail <model-instance-methods>`a chuimsíonn dornán iompar bunachar sonraí a bheidh uait a shaincheapadh. Go háirithe is minic a bheidh tú ag iarraidh an bealach a athrú: meth: `~Model.save agus:meth: ~Model.delete obair.

Tá saor ort na modhanna seo (agus aon mhodh samhail eile) a shárú chun iompar a athrú.

Cás úsáide clasaiceach chun na modhanna ionsuite a shárú ná más mian leat rud éigin a tharlóidh aon uair a shábhálann tú réad. Mar shampla (féach: meth: ~Model.save le haghaidh doiciméadú ar na paraiméadair a ghlacann sé leis):

Code
from django.db import models


class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def save(self, **kwargs):
        do_something()
        super().save(**kwargs)  # Call the "real" save() method.
        do_something_else()

Is féidir leat cosc a chur ar shábháil freisin:

Code
from django.db import models


class Blog(models.Model):
    name = models.CharField(max_length=100)
    tagline = models.TextField()

    def save(self, **kwargs):
        if self.name == "Yoko Ono's blog":
            return  # Yoko shall never have her own blog!
        else:
            super().save(**kwargs)  # Call the "real" save() method.

Tá sé tábhachtach cuimhneamh ar an modh sáraicme a ghlaoch - sin an gnó sin ``super () .save (** kwargs) `- chun a chinntiú go sábhálfar an réad sa bhunachar sonraí fós. Má dhéanann tú dearmad glaoch ar an modh sáraicme, ní tharlóidh an t-iompar réamhshocraithe agus ní dhéanfar teagmháil leis an mbunachar sonraí.

Tá sé tábhachtach freisin go dtéann tú tríd na hargóintí is féidir a chur ar aghaidh chuig an modh samhail - sin an rud a dhéanann an giotán **kwargs `. Leathnóidh Django, ó am go ham, cumais modhanna samhail ionsuite, ag cur argóintí eochairfhocal nua leis. Má úsáideann tú ``**kwargs ``i do shainmhínithe ar mhodh, ráthaítear duit go dtacóidh do chód leis na hargóintí sin go huathoibríoch nuair a chuirtear iad leis.

Más mian leat luach réimse a nuashonrú sa modh:meth: ~Model.save, b'fhéidir gur mhaith leat an réimse seo a chur leis an argóint eochairfhocal update_fields. Cinnteoidh sé seo go sábhálfar an réimse nuair a shonraítear update_fields. Mar shampla:

Code
from django.db import models
from django.utils.text import slugify


class Blog(models.Model):
    name = models.CharField(max_length=100)
    slug = models.TextField()

    def save(self, **kwargs):
        self.slug = slugify(self.name)
        if (
            update_fields := kwargs.get("update_fields")
        ) is not None and "name" in update_fields:
            kwargs["update_fields"] = {"slug"}.union(update_fields)
        super().save(**kwargs)

Féach: ref: ref-models-update-fields le haghaidh tuilleadh sonraí.

SQL saincheaptha a fheidhmiúLink to this heading

Patrún coitianta eile is ea ráitis SQL saincheaptha a scríobh i modhanna samhail agus modhanna leibhéal modúl. Le haghaidh tuilleadh sonraí maidir le SQL amh a úsáid, féach an doiciméadú ar:doc: using</topics/db/sql> raw SQL.

Oidhreacht múnlaLink to this heading

Oibríonn oidhreacht mhúnla i Django beagnach cosúil leis an mbealach a oibríonn gnáthoidhreacht aicme i Python, ach ba cheart na buneilimintí ag tús an leathanaigh a leanúint fós. Ciallaíonn sé sin gur chóir don rang bonn fo-aicme: class: Django.db.Models.Model.

Is é an t-aon chinneadh a chaithfidh tú a dhéanamh ná an dteastaíonn uait go mbeadh na samhlacha tuismitheoirí ina samhlacha ina gceart féin (lena dtáblaí bunachar sonraí féin), nó mura bhfuil na tuismitheoirí ach sealbhóirí faisnéise coiteann nach mbeidh le feiceáil ach trí na samhlacha leanaí.

Tá trí stíl oidhreachta ann atá indéanta i Django.

  1. Go minic, ní bheidh tú ag iarraidh ach an rang tuismitheoirí a úsáid chun faisnéis a shealbhú nach dteastaíonn uait a chlóscríobh do gach samhail linbh. Ní úsáidfear an rang seo ina n-aonar riamh, mar sin: ref: Is iad abstract-base-classes an rud atá ina dhiaidh leat.

  2. Má tá tú ag fo-aicmiú samhail atá ann cheana (rud éigin ó fheidhmchlár eile go hiomlán b'fhéidir) agus má theastaíonn uait go mbeadh a tábla bunachar sonraí féin ag gach samhail, :ref: is é `il-tábla-oidhreacht `an bealach le dul.

  3. Faoi dheireadh, mura dteastaíonn uait ach iompar samhail ar leibhéal Python a mhodhnú, gan réimsí na samhlacha a athrú ar bhealach ar bith, is féidir leat:ref: proxy-models a úsáid.

Aicmí bonn teibíLink to this heading

Tá ranganna bonn teibí úsáideach nuair is mian leat roinnt faisnéise coitianta a chur i roinnt samhlacha eile. <meta-options>Scríobhann tú do rang bonn agus cuireann tú abstract=True sa rang:ref: `Meta `. Ní úsáidfear an tsamhail seo ansin chun aon tábla bunachar sonraí a chruthú. Ina áit sin, nuair a úsáidtear é mar bhunrang do mhúnlaí eile, cuirfear a réimsí le réimsí ranga an linbh.

Sampla:

Code
from django.db import models


class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True


class Student(CommonInfo):
    home_group = models.CharField(max_length=5)

Beidh trí réimse ag an tsamhail Mac Léinn ``: `ainm, aois ``agus ``grúpa_baile`. Ní féidir an tsamhail `CommonInfo ``a úsáid mar ghnáthmhúnla Django, ós rud é gur aicme bonn teibí é. Ní ghineann sé tábla bunachar sonraí ná ní bhfuil bainisteoir aige, agus ní féidir é a thionscnamh nó a shábháil go díreach.

Is féidir réimsí oidhreachta ó ranganna bonn teibí a shárú le réimse nó luach eile, nó iad a bhaint le None.

Maidir le go leor úsáidí, beidh an cineál seo oidhreachta samhail go díreach mar a theastaíonn uait. Soláthraíonn sé bealach chun faisnéis choiteann a bhaint amach ag leibhéal Python, agus ní chruthaíonn sé ach tábla bunachar sonraí amháin in aghaidh an tsamhail linbh ag leibhéal an bhunachar sonraí.

Oidhreacht MetaLink to this heading

Nuair a chruthaítear rang bonn teib <meta-options>í, déanann Django aon aicme istigh: ref: Meta `a dhearbhaigh tú sa rang bonn atá ar fáil mar thréith. <meta-options>Mura dhearbhóidh rang linbh a rang féin:ref: `Meta <meta-options>, beidh sé oidhreacht ar an tuismitheoirí:ref: Meta. Más mian leis an leanbh rang an tuismitheora: ref: `Meta <meta-options>`a leathnú, is féidir leis é a fho-aicmiú. Mar shampla:

Code
from django.db import models


class CommonInfo(models.Model):
    # ...
    class Meta:
        abstract = True
        ordering = ["name"]


class Student(CommonInfo):
    # ...
    class Meta(CommonInfo.Meta):
        db_table = "student_info"

<meta-options>Déanann Django coigeartú amháin ar <meta-options>aicme: ref: Meta `de bhonn teibí: sula ndéantar an tréith: ref: `Meta a shuiteáil, leagann sé abstract = false ``. Ciallaíonn seo nach n-éiríonn leanaí bunranganna teibí ina ranganna teibí go huathoibríoch iad féin. Chun rang bonn teibí a dhéanamh a thagann oidhreacht ó rang bonn teibí eile, mór duit ``abstract=True a shocrú go sainráite ar an leanbh.

Ní bheidh ciall ar roinnt tréithe a chur san áireamh san aicme:ref: Meta <meta-options>`de rang bonn teibí. Mar shampla, lena n-áirítear ``db_table` chiallódh go n- <meta-options>úsáidfeadh na ranganna uile leanaí (na cinn nach sonraíonn a gcuid féin: ref: `Meta `) an tábla bunachar sonraí céanna, rud beagnach cinnte nach bhfuil an rud a theastaíonn uait.

Mar gheall ar an mbealach a oibríonn oidhreacht Python, má fhaigheann rang linbh oidhreacht ó iliomad bunaicmí teibí, ní bhe <meta-options>idh ach na roghanna: ref: Meta `ón gcéad rang liostaithe oidhreacht de réir réamhshocraithe. <meta-options>Chun roghanna oidhreacht:ref: `Meta <meta-options>`ó iliomad bunaicmí teibí, ní mór duit an oidhreacht: ref: `Meta a dhearbhú go sainráite. Mar shampla:

Code
from django.db import models


class CommonInfo(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    class Meta:
        abstract = True
        ordering = ["name"]


class Unmanaged(models.Model):
    class Meta:
        abstract = True
        managed = False


class Student(CommonInfo, Unmanaged):
    home_group = models.CharField(max_length=5)

    class Meta(CommonInfo.Meta, Unmanaged.Meta):
        pass

Oidhreacht il-táblaLink to this heading

Is é an dara cineál oidhreachta samhail a thacaíonn Django ná nuair a bhíonn gach samhail san ordlathas ina samhail leis féin. Freagraíonn gach samhail dá tábla bunachar sonraí féin agus is féidir é a fhiosrú agus a chruthú ina n-aonar. Tugann an caidreamh oidhreachta naisc isteach idir samhail an linbh agus gach ceann dá thuismitheoirí (trí:class: ~django.db.models.onetoonefield) a chruthaítear go huathoibríoch. Mar shampla:

Code
from django.db import models


class Place(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)


class Restaurant(Place):
    serves_hot_dogs = models.BooleanField(default=False)
    serves_pizza = models.BooleanField(default=False)

Beidh na réimsí go léir de Áite ar fáil i Bialain freisin, cé go mbeidh na sonraí ina gcónaí i dtábla bunachar sonraí difriúil. Mar sin is féidir iad seo a dhéanamh:

Python console
>>> Place.objects.filter(name="Bob's Cafe")
>>> Restaurant.objects.filter(name="Bob's Cafe")

Má tá Áite agat atá ina Bialain freisin, is féidir leat teacht ón réad Áite go dtí an réad Bialainne tríd an leagan beaga den ainm samhail a úsáid:

Python console
>>> p = Place.objects.get(id=12)
# If p is a Restaurant object, this will give the child class:
>>> p.restaurant
<Restaurant: ...>

Mar sin féin, mura raibh p` sa sampla thuas*ní* ina Bialann ``(cruthaíodh é go díreach mar réad ``Plac` nó gur tuismitheoir aicme éigin eile é), d'ardódh tagairt do p.restaurant` eisceacht Restaurant.doesNotExist.

Breathnaítear go huathoibríoch: class: ~django.db.models.onetoonefield ar Restaurant a nascann é le Plac mar seo:

Code
place_ptr = models.OneToOneField(
    Place,
    on_delete=models.CASCADE,
    parent_link=True,
    primary_key=True,
)

<django.db.models.OneToOneField.parent_link>Is féidir leat an réimse sin a shárú trí do chuid féin a dhearbhú:: ~django.db.models.onetoonefield le: attr: Parent_link=True `ar ``Restaurant`.

Meta agus oidhreacht il-táblaLink to this heading

<meta-options>Sa staid oidhreachta iltábla, níl sé ciall do rang linbh oidhreacht a thabhairt dá thuismitheoirí:ref: `Meta `. Cuireadh na <meta-options>roghanna uile: ref: `Meta `i bhfeidhm cheana féin ar an rang tuismitheoirí agus de ghnáth ní bheadh iompar contrártha mar thoradh orthu a chur i bhfeidhm arís (tá sé seo i gcodarsnacht leis an gcás bunaicme teibí, i gcás nach bhfuil an bunaicme ann féin).

<meta-options>Mar sin níl rochtain ag samhail leanbh ar rang a thuismitheoir:ref: Meta `. Mar sin féin, tá cúpla cás teoranta ann ina n-oidhreann an leanbh iompar ón tuismitheoir: mura sonraíonn an leanbh tréith: `~django.db.models.options.ordering nó a:attr: ~django.db.models.options.get_latest_by tréith, oidhreoidh sé iad seo óna thuismitheoir.

Má tá ordú ag an tuismitheoir agus mura dteastaíonn uait go mbeadh aon ordú nádúrtha ag an leanbh, is féidir leat é a dhíchumasú go sainráite:

Code
class ChildModel(ParentModel):
    # ...
    class Meta:
        # Remove parent's ordering effect
        ordering = []

Caidreamh oidhreachta agus droim ar aisLink to this heading

Because multi-table inheritance uses an implicit OneToOneField to link the child and the parent, it's possible to move from the parent down to the child, as in the above example. However, this uses up the name that is the default related_name value for ForeignKey and ManyToManyField relations. If you are putting those types of relations on a subclass of the parent model, you must specify the related_name attribute on each such field. If you forget, Django will raise a validation error.

Mar shampla, ag baint úsáide as an rang Place thuas arís, cruthaímid fo-aicme eile le a:class: ~django.db.models.manyToManyField:

Code
class Supplier(Place):
    customers = models.ManyToManyField(Place)

Mar thoradh air seo tá an earráid:

Pytb
Reverse query name for 'Supplier.customers' clashes with reverse query
name for 'Supplier.place_ptr'.

HINT: Add or change a related_name argument to the definition for
'Supplier.customers' or 'Supplier.place_ptr'.

Ag cur related_name leis an réimse custaiméirí ``mar seo a leanas réitfeadh an earráid: ``Models.manyTomanyField (Place, related_name='provider').

Múnlaí proxyLink to this heading

Nuair a úsáidtear: ref: oidhreacht il-tábla <multi-table-inheritance>, cruthaítear tábla bunachar sonraí nua do gach fo-aicme de mhúnla. Is é seo de ghnáth an t-iompar atá ag teastáil, ós rud é go dteastaíonn áit ón bhfo-rang chun aon réimsí sonraí breise nach bhfuil i láthair ar an rang bonn a stóráil. Uaireanta, áfach, ní theastaíonn uait ach iompar Python samhail a athrú - b'fhéidir an bainisteoir réamhshocraithe a athrú, nó modh nua a chur leis.

Seo a bhfuil oidhreacht samhail seachfhreastalaí ann: * proxy* a chruthú don tsamhail bhunaidh. Is féidir leat cásanna den tsamhail seachfhreastalaí a chruthú, a scriosadh agus a nuashonrú agus sábhálfar na sonraí go léir amhail is dá mbeadh an tsamhail bhunaidh (neamh-sheachadaithe) á úsáid agat. Is í an difríocht ná gur féidir leat rudaí mar ordú an tsamhail réamhshocraithe nó an bainisteoir réamhshocraithe sa seachfhreastalaí a athrú, gan an bunaidh a athrú.

Fógraítear samhlacha seachfhreastalaí cosúil le gn Deir tú le Django gur samhail seachfhreastalaí é trí:attr: ~django.db.models.options.proxy tréith an aicme Meta a shocrú go True.

Mar shampla, cuir i gcás gur mhaith leat modh a chur leis an tsamhail ``Person`. Is féidir leat é a dhéanamh mar seo:

Code
from django.db import models


class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)


class MyPerson(Person):
    class Meta:
        proxy = True

    def do_something(self):
        # ...
        pass

Feidhmíonn an rang MyPerson` ar an tábla bunachar sonraí céanna leis an rang Person a thuismitheoir. Go háirithe, beidh aon chásanna nua de Person inrochtana freisin trí My Person, agus a mhalairt:

Python console
>>> p = Person.objects.create(first_name="foobar")
>>> MyPerson.objects.get(first_name="foobar")
<MyPerson: foobar>

D'fhéadfá samhail seachfhreastalaí a úsáid freisin chun ordú réamhshocraithe difriúil ar mhúnla a shainiú. B'fhéidir nach mbeadh tú ag iarraidh an tsamhail Person` a ordú i gcónaí, ach ordú go rialta de réir an tréith ``last_name nuair a úsáideann tú an seachfhreastalaí:

Code
class OrderedPerson(Person):
    class Meta:
        ordering = ["last_name"]
        proxy = True

Anois ní bheidh gnáth-cheisteanna Person` neamh-ordaithe agus ordófar ceisteanna ``OrderedPerson ag last_name.

<meta-and-multi-table-inheritance>Oifreann samhlacha seachfhreastalaí tréithe Meta: ref: `ar an mbealach céanna le samhlacha rialta `.

Tugann QuerySet fós an tsamhail a iarradh ar aisLink to this heading

Níl aon bhealach ann chun réad ``MyPerson` a thabhairt ar Django a thabhairt ar ais, abair, aon uair a fhiosraíonn tú ar rudaí ``Person`. Tabharfaidh tacar fiosrúcháin do rudaí ``Person` ar ais na cineálacha rudaí sin. Is é pointe iomlán na rudaí seachfhreastalaí ná go n-úsáidfidh cód ag brath ar an ``Person` bunaidh iad siúd agus is féidir le do chód féin na síntí a chuir tú san áireamh a úsáid (nach bhfuil aon chód eile ag brath air ar aon nós). Ní bealach é chun rud éigin de do chruthú féin a chur in ionad an tsamhail ``Person` (nó aon rud eile) i ngach áit.

Srianta aicme bonnLink to this heading

Caithfidh samhail seachfhreastalaí oidhreacht ó rang samhail neamh-teibí amháin go díreach Ní féidir leat oidhreacht a dhéanamh ó iolracha samhlacha neamh-teibí toisc nach soláthraíonn an tsamhail seachfhreastalaí aon nasc idir na sraitheanna sna táblaí bunachar sonraí Is féidir le samhail seachfhreastalaí oidhreacht ó aon líon ranganna samhail teibí, ar an gcoinníoll nach sainmhíníonn siad aon réimsí samhlacha. Féadfaidh samhail seachfhreastalaí oidhreacht freisin ó aon líon samhlacha seachfhreastalaí a roinneann rang tuismitheoirí coiteann neamh

Bainisteoirí samhail seachfLink to this heading

Mura sonraíonn tú aon bhainisteoirí samhlacha ar mhúnla seachfhreastalaí, faigheann sé na bainisteoirí oidhreachta óna thuismitheoirí samhlacha. Má shainmhíníonn tú bainisteoir ar an tsamhail seachfhreastalaí, beidh sé mar réamhshocrú, cé go mbeidh aon bhainisteoirí a shainmhínítear ar na tuismitheoirí ranganna ar fáil fós.

Ag leanúint lenár sampla ó thuas, d'fhéadfá an bainisteoir réamhshocraithe a úsáidtear a athrú nuair a fhiosraíonn tú an tsamhail ``Person` mar seo:

Code
from django.db import models


class NewManager(models.Manager):
    # ...
    pass


class MyPerson(Person):
    objects = NewManager()

    class Meta:
        proxy = True

Más mian leat bainisteoir nua a chur leis an Seachfhreastalaí, gan an réamhshocrú atá ann cheana a athsholáthar, is féidir leat na te <custom-managers-and-inheritance>icnící a thuairiscítear sa dhoiciméadúiséireacht: `bainisteoir saincheapaithe' a úsáid: bunaicme a chruthú ina bhfuil na bainisteoirí nua agus é sin a oidhreacht tar éis an bunaicme:

Code
# Create an abstract class for the new manager.
class ExtraManagers(models.Model):
    secondary = NewManager()

    class Meta:
        abstract = True


class MyPerson(Person, ExtraManagers):
    class Meta:
        proxy = True

Is dócha nach mbeidh ort é seo a dhéanamh go minic, ach, nuair a dhéanann tú, is féidir é a dhéanamh.

Difríochtaí idir oidhreacht seachfhreastalaí agus samhlacha neLink to this heading

D'fhéadfadh go mbeadh cuma an-chosúil ar oidhreacht samhail seachfhreastalaí le samhail neamh-bhainistithe a chruthú, ag baint úsáide as tréith: attr: ~django.db.models.options.managed ar aicme Meta samhail.

Le socrú cúramach de: attr: `Meta.db_table <django.db.models.Options.db_table>`d'fhéadfá samhail neamh-bhainistithe a chruthú a dhéanann scáth ar mhúnla atá ann cheana agus a chuireann modhanna Python leis. Mar sin féin, bheadh sé sin an-athchleachtach agus leochaileach mar ní mór duit an dá chóip a choinneáil sioncronaithe má dhéanann tú aon athruithe.

Ar an láimh eile, tá sé i gceist le samhlacha seachfhreastalaí iompar díreach cosúil leis an tsamhail atá siad ag seachfhreastalaí dó. Bíonn siad i gcónaí i gcomhréir leis an tsamhail tuismitheora ós rud é go ndéanann siad a réimsí agus a bhainisteoirí

Is iad na rialacha ginearálta:

  1. Má tá tú ag scáthú samhail nó tábla bunachar sonraí atá ann cheana agus mura dteastaíonn na colúin bunaidh tábla bunachar sonraí uile uait, bain úsáid as Meta.Managed=False`. De ghnáth bíonn an rogha sin úsáideach chun tuairimí bunachar sonraí agus táblaí nach bhfuil faoi smacht Django a shamhaltú.

  2. Más mian leat iompar samhail Python amháin a athrú, ach na réimsí céanna go léir a choinneáil mar atá sa bhunaidh, bain úsáid as Meta.proxy=True`. Socraíonn sé seo rudaí suas ionas gur cóip cruinn é an tsamhail seachfhreastalaí de struchtúr stórála an tsamhail bhunaidh nuair a shábháiltear sonraí

Oidhreacht iolrachLink to this heading

Díreach mar atá le fo-aicmiú Python, is féidir go mhúnla Django oidhreacht ó mhúnlaí ilthuismitheoirí. Coinnigh i gcuimhne go bhfuil feidhm ag gnáthrialacha réitigh ainm Python. Is é an ché <meta-options>ad rang bonn a bhfuil ainm áirithe (e.g.:ref: Meta `) le feiceáil ann an ceann a úsá <meta-options>idtear; mar shampla, ciallaíonn sé seo má tá aicme a:ref: `Meta i iliomad tuismitheoirí, ní bheidh ach an chéad cheann le húsáid, agus déanfar neamhaird ar gach duine eile.

Go ginearálta, ní bheidh ort oidhreacht a dhéanamh ó iliomad tuismitheoirí. Is é an príomhchás úsáide ina bhfuil sé seo úsáideach ná do ranganna “measctha isteach”: réimse nó modh breise ar leith a chur le gach rang a thugann an meascán in oidhreacht. Déan iarracht d'ordlathais oidhreachta a choinneáil chomh simplí agus chomh simplí agus is féidir ionas nach mbeidh ort streachailt a dhéanamh chun oibriú amach cá as a bhfuil píosa faisnéise áirithe ag teacht.

Tabhair faoi deara go n-ardóidh earráid ag oidhreacht ó iolracha samhlacha a bhfuil príomhréimse coitianta “id” acu. Chun oidhreacht iolrach a úsáid i gceart, is féidir leat explicit:class: ~django.db.models.autofield a úsáid sna bunmhúnlaí:

Code
class Article(models.Model):
    article_id = models.AutoField(primary_key=True)
    ...


class Book(models.Model):
    book_id = models.AutoField(primary_key=True)
    ...


class BookReview(Book, Article):
    pass

Nó bain úsáid as sinsear coiteann chun an: class: ~django.db.models.autofield a shealbhú. Éilíonn sé seo úsáid a bhaint as explicit:class: ~django.db.models.onetoonefield ó gach samhail tuismitheora go dtí an sinsear coiteann chun coimhlint idir na réimsí a ghineann agus a oidhreann an leanbh go huathoibríoch a sheachaint:

Code
class Piece(models.Model):
    pass


class Article(Piece):
    article_piece = models.OneToOneField(
        Piece, on_delete=models.CASCADE, parent_link=True
    )
    ...


class Book(Piece):
    book_piece = models.OneToOneField(Piece, on_delete=models.CASCADE, parent_link=True)
    ...


class BookReview(Book, Article):
    pass

Ní cheadaítear ainm réimse “i bhfolach”Link to this heading

I ngnáthoidhreacht aicme Python, ceadaítear do rang linbh aon tréith ón rang tuismitheora a shárú. I Django, ní cheadaítear é seo de ghnáth do réimsí samhlacha. Má tá réimse ar a dtugtar údar ag rang bun-mhúnla neamh-teibí, ní féidir leat réimse samhail eile a chruthú nó tréith ar a dtugtar údar a shainiú in aon aicme a fhaigheann oidhreacht ón rang bonn sin.

Ní bhaineann an srian seo le réimsí samhlacha a oidhreacht ó mhúnla teibí. Féadfar réimsí den sórt sin a shárú le réimse nó luach eile, nó iad a bhaint trí “field_name = None” a shocrú.

Bíonn deacrachtaí i réimsí ar nós cásanna nua a thionscnamh (ag sonrú cén réimse atá á thionscnamh i Samhail. __init__`) agus sraitheadh. Is gnéithe iad seo nach gá le gnáthoidhreacht aicme Python déileáil leo ar an mbealach céanna, mar sin níl an difríocht idir oidhreacht mhúnla Django agus oidhreacht aicme Python treallach.

Ní bhaineann an srian seo ach le tréithe arba:class: ~django.db.models.field cásanna. Is féidir gnáthtréithe Python a shárú más mian leat. Ní bhaineann sé ach le hainm na tréithe mar a fheiceann Python é: má tá ainm an cholún bunachar sonraí á shonrú agat de láimh, is féidir leat an t-ainm colún céanna a bheith le feiceáil i samhail leanbh agus sinsear le haghaidh oidhreachta il-tábla (is colúin iad i dhá thábla bunachar sonraí éagsúla).

Ardóidh Django a:exc: ~django.core.exceptions.fielderror má sháraigh tú aon réimse samhail in aon mhúnla sinsear.

Tabhair faoi deara, mar gheall ar an mbealach a réitítear réimsí le linn sainmhínithe ranga, réitear réimsí samhail a oidhreacht ó iliomad samhlacha teibí tuismitheoirí i ord doimhneach- Tá sé seo i gcodarsnacht le Python MRO caighdeánach, a réitear ar leithead ar dtús i gcásanna oidhreachta cruth diamaint. Ní théann an difríocht seo ach ar ordlathais chasta samhlacha, ar cheart duit iarracht a dhéanamh (de réir na comhairle thuas) a sheachaint.

Múnlaí a eagrú i bpacáisteLink to this heading

Cruthaíonn an t-ordú: DjaDmin: manage.py startapp struchtúr feidhmchláir a chuimsíonn comhad ``<startapp>models.py`. Má tá go leor samhlacha agat, d'fhéadfadh sé a bheith úsáideach iad a eagrú i gcomhaid ar leithligh.

Chun é sin a dhéanamh, cruthaigh pacáiste samhlacha ``. Bain ``models.py agus cruthaigh eolaire myapp/models/ le comhad __init__.py agus na comhaid chun do mhúnlaí a stóráil. Ní mór duit na samhlacha a iompórtáil sa chomhad __init__.py.

Mar shampla, má bhí organic.py agus synthetic.py agat san eolaire models:

myapp/samhlacha/__init__.py
Python
from .organic import Person
from .synthetic import Robot

Tá na buntáistí ag iompórtáil gach samhail go sainráite seachas from .models allmhairiúcháin * a úsáid ná gan an spás ainmneacha a ghabháil, an cód a dhéanamh níos inléite, agus uirlisí anailíse cód a choinneáil úsáideach.