Tagairt sampla samhailLink to this heading
Déanann an doiciméad seo cur síos ar shonraí an API ``Samhail ``. Tógann sé ar an ábhar a chuirtear i láthair sna treoracha: doc: model agus:doc: ceisteanna bunachar sonraí </topics/db/models>, mar sin is dócha go mbeidh tú ag iarraidh na do</topics/db/queries> iciméid sin a léamh agus a thuiscint sula léann tú an ceann seo.
Le linn na tagartha seo úsáidfimid an:ref: `samplacha samplaí blag </topics/db/queries> <queryset-model-example>`a chuirtear i láthair in:doc: `treoir fiosrúcháin bunachar sonraithe'.
Cruthú rudaíLink to this heading
Chun sampla nua de mhúnla a chruthú, cuir isteach é cosúil le haon rang Python eile:
- class Model(**kwargs)Link to this definition
The keyword arguments are the names of the fields you've defined on your model.
Note that instantiating a model in no way touches your database; for that, you
need to save().
Luchtú samhail a shaincheapadhLink to this heading
- classmethod Model.from_db(db, field_names, values)Link to this definition
Is féidir an modh ``from_db () ``a úsáid chun cruthú sampla samhail a shaincheapadh agus tú ag luchtú ón mbunachar sonraí.
Tá an ailias bunachar sonraí don bhunachar sonraí ón argóint db` a luchtaítear an tsamhail uaidh, tá field_names` ainmneacha na réimsí luchtaithe go léir, agus tá luacha` na luachanna luchtaithe do gach réimse in field_names`. Tá na field_names san ord céanna leis na luacha`. Má tá réimsí uile an tsamhail i láthair, ansin ráthaítear go mbeidh luacha san ord a bhfuil __init__ () `ag súil leo. Is é sin, is féidir an sampla a chruthú le ``cls (*luachanna) `. Má chuirtear aon réimsí ar iarchur, ní bheidh siad le feiceáil in field_names`. Sa chás sin, sannadh luach Django.db.Models.Deferred do gach ceann de na réimsí atá in easnamh.
Chomh maith leis an tsamhail nua a chruthú, ní mór don modh from_db () ``na bratacha ```adding agus db a shocrú sa instanse nua 's:attr: `~Model. tréith _state.
Seo thíos sampla a thaispeánann conas luachanna tosaigh réimsí a luchtaítear ón mbunachar sonraí a thaifeadadh:
from django.db.models import DEFERRED
@classmethod
def from_db(cls, db, field_names, values):
# Default implementation of from_db() (subject to change and could
# be replaced with super()).
if len(values) != len(cls._meta.concrete_fields):
values = list(values)
values.reverse()
values = [
values.pop() if f.attname in field_names else DEFERRED
for f in cls._meta.concrete_fields
]
instance = cls(*values)
instance._state.adding = False
instance._state.db = db
# customization to store the original field values on the instance
instance._loaded_values = dict(
zip(field_names, (value for value in values if value is not DEFERRED))
)
return instance
def save(self, **kwargs):
# Check how the current values differ from ._loaded_values. For example,
# prevent changing the creator_id of the model. (This example doesn't
# support cases where 'creator_id' is deferred).
if not self._state.adding and (
self.creator_id != self._loaded_values["creator_id"]
):
raise ValueError("Updating the value of creator isn't allowed")
super().save(**kwargs)
Taispeánann an sampla thuas cur chun feidhme iomlán from_db () `chun soiléiriú a dhéanamh ar an gcaoi a ndéantar é sin. Sa chás seo bheadh sé in ann glao ``super () ``a úsáid sa mhodh ``from_db ().
Rudaí athnuachana ón mbunacharLink to this heading
Má scriosann tú réimse ó shampla samhail, déanann rochtain a fháil air an luach ón mbunachar sonraí a athluchtú arís:
>>> obj = MyModel.objects.first()
>>> del obj.field
>>> obj.field # Loads the field from the database
- Model.refresh_from_db(using=None, fields=None, from_queryset=None)Link to this definition
- Model.arefresh_from_db(using=None, fields=None, from_queryset=None)Link to this definition
Asynchronous version: arefresh_from_db()
Más gá duit luachanna samhail a athluchtú ón mbunachar sonraí, is féidir leat an modh `fresh_from_db () `a úsáid. Nuair a ghlaofar an modh seo gan argóintí déantar an méid seo a leanas:
Déantar gach réimse neamh-iarchurtha den tsamhail a nuashonrú go dtí na luachanna atá i láthair sa bhunachar sonraí.
Déantar aon chaidreamh taisceáilte a ghlanadh ón gcás athluchtaithe.
Ní dhéantar ach réimsí den tsamhail a athluchtú ón mbunachar sonraí. Ní dhéantar luachanna eile atá ag brath ar bhunachar sonraí mar anótaí a athluchtú. Any:func: @cached_property<django.utils.functional.cached_property> ní ghlantar tréithe ach an oiread.
Tarlaíonn an t-athluchtú ón mbunachar sonraí ar luchtadh an cás uaidh, nó ón mbunachar sonraí réamhshocraithe mura luchtaíodh an cás ón mbunachar sonraí. Is féidir an argóint ``úsáid ``a úsáid chun an bunachar sonraí a úsáidtear le haghaidh athluchtaithe a chur i bhfeidhm.
Is féidir iallach a chur ar an tacar réimsí a luchtú tríd an argóint ``réimsí ``a úsáid.
Mar shampla, chun tástáil a dhéanamh go raibh an nuashonrú ag súil leis mar thoradh ar ghlao ``update () ``, d'fhéadfá tástáil cosúil leis seo a scríobh:
def test_update_result(self):
obj = MyModel.objects.create(val=1)
MyModel.objects.filter(pk=obj.pk).update(val=F("val") + 1)
# At this point obj.val is still 1, but the value in the database
# was updated to 2. The object's updated value needs to be reloaded
# from the database.
obj.refresh_from_db()
self.assertEqual(obj.val, 2)
Tabhair faoi deara, nuair a bhíonn rochtain ar réimsí iarchurtha, go dtarlaíonn luach an réimse iarchurtha tríd an modh seo. Dá bhrí sin is féidir an bealach a tharlaíonn luchtú iarchurtha a shaincheapadh. Taispeánann an sampla thíos conas is féidir le réimsí uile an cháis a athluchtú nuair a dhéantar réimse iarchurtha a athluchtú:
class ExampleModel(models.Model):
def refresh_from_db(self, using=None, fields=None, **kwargs):
# fields contains the name of the deferred field to be
# loaded.
if fields is not None:
fields = set(fields)
deferred_fields = self.get_deferred_fields()
# If any deferred field is going to be loaded
if fields.intersection(deferred_fields):
# then load all of them
fields = fields.union(deferred_fields)
super().refresh_from_db(using, fields, **kwargs)
Ceadaíonn an argóint from_queryset tacar ceisteanna difriúil a úsáid ná an ceann a cruthaíodh ó: attr: `~django.db.models.model. _bainisteoir bunaisteoir'. Tugann sé níos mó smachta duit ar an gcaoi a n-athluchtaítear an tsamhail. Mar shampla, nuair a úsáideann do mhúnla scriosadh bog is féidir leat ``fresh_from_db () ``a dhéanamh chun é seo a chur san áireamh:
obj.refresh_from_db(from_queryset=MyModel.active_objects.all())
Is féidir leat rudaí a bhaineann le taisce a ghlanfaí ar shlí eile ón gcás athluchtaithe:
obj.refresh_from_db(from_queryset=MyModel.objects.select_related("related_field"))
Is féidir leat an tsraith a ghlasáil go dtí deireadh an idirbheart sula ndéanfaidh tú luachanna samhail a athlódáil:
obj.refresh_from_db(from_queryset=MyModel.objects.select_for_update())
- Model.get_deferred_fields()Link to this definition
Modh cúntóra a thugann tacar ina bhfuil ainmneacha tréithe na réimsí sin go léir atá iarchurtha faoi láthair don tsamhail seo.
Rudaí a bhailíochtúLink to this heading
Tá ceithre chéim i gceist le samhail a bhailíochtú:
Validate the model fields -
Model.clean_fields()Validate the model as a whole -
Model.clean()Validate the field uniqueness -
Model.validate_unique()Bailíochtú na srianta -:meth: Model.validate_restricints
Déantar na ceithre chéim go léir nuair a ghlaonn tú ar mhodh samhail 's:meth: ~model.full_clean.
When you use a ModelForm, the call to
is_valid() will perform these validation steps for
all the fields that are included on the form. See the ModelForm
documentation for more information. You should only
need to call a model's full_clean() method if you plan to handle
validation errors yourself, or if you have excluded fields from the
ModelForm that require validation.
- Model.full_clean(exclude=None, validate_unique=True, validate_constraints=True)Link to this definition
This method calls Model.clean_fields(), Model.clean(),
Model.validate_unique() (if validate_unique is True), and
Model.validate_constraints() (if validate_constraints is True)
in that order and raises a ValidationError that
has a message_dict attribute containing errors from all four stages.
Is féidir an argóint roghnach eisiam a úsáid chun taca` d'ainmneacha réimse a sholáthar is féidir iad a eisiamh ó bhailíochtú agus glantachán. :class: ~django.forms.ModelForm úsáideann an argóint seo chun réimsí nach bhfuil i láthair ar d'fhoirm a eisiamh ó bheith bailíochtaithe ós rud é nach bhféadfadh an t-úsáideoir aon earráidí a ardaíodh a cheartú.
Note that full_clean() will not be called automatically when you call
your model's save() method. You'll need to call it manually
when you want to run one-step model validation for your own manually created
models. For example:
from django.core.exceptions import ValidationError
try:
article.full_clean()
except ValidationError as e:
# Do something based on the errors contained in e.message_dict.
# Display them to a user, or handle them programmatically.
pass
Is é an chéad chéim a dhéanann ``full_clean () ``gach réimse aonair a ghlanadh.
- Model.clean_fields(exclude=None)Link to this definition
Bailíochnóidh an modh seo gach réimse ar do mhúnla. Ligeann an argóint roghnach eisiam duit taca` d'ainmneacha réimse a sholáthar chun eisiamh ó bhailíochtú. Ardóidh sé a:exc: ~django.core.exceptions.validationError má theipeann ar aon réimsí bailíochtú.
The second step full_clean() performs is to call Model.clean().
This method should be overridden to perform custom validation on your model.
- Model.clean()Link to this definition
Ba chóir an modh seo a úsáid chun bailíochtú samhail saincheaptha a sholáthar, agus tréithe ar do mhúnla a mhodhnú más mian. Mar shampla, d'fhéadfá é a úsáid chun luach a sholáthar go huathoibríoch do réimse, nó chun bailíochtú a dhéanamh a éilíonn rochtain ar níos mó ná réimse amháin:
import datetime
from django.core.exceptions import ValidationError
from django.db import models
from django.utils.translation import gettext_lazy as _
class Article(models.Model):
...
def clean(self):
# Don't allow draft entries to have a pub_date.
if self.status == "draft" and self.pub_date is not None:
raise ValidationError(_("Draft entries may not have a publication date."))
# Set the pub_date for published items if it hasn't been set already.
if self.status == "published" and self.pub_date is None:
self.pub_date = datetime.date.today()
Note, however, that like Model.full_clean(), a model's clean()
method is not invoked when you call your model's save() method.
Sa sampla thuas, rinneadh an eisceacht: exc: ~Django.Core.Exceptions.ValidationError arna ardú ag ``Model.clean () ``le sreang, mar sin stóráilfear é in eochair foclóir earráide speisialta, :data: ~Django.Core.Exceptions.non_field_errors. Úsáidtear an eochair seo le haghaidh earráidí atá ceangailte leis an tsamhail iomlán in ionad le réimse ar leith:
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
try:
article.full_clean()
except ValidationError as e:
non_field_errors = e.message_dict[NON_FIELD_ERRORS]
Chun eisceachtaí a shannadh do réimse ar leith, cuir ainmne:exc: ~django.core.exceptions.validationError le foclóir, áit a bhfuil na heochracha ainmneacha réimse. D'fhéadfaimis an sampla roimhe seo a nuashonrú chun an earráid a shannadh don réimse pub_date:
class Article(models.Model):
...
def clean(self):
# Don't allow draft entries to have a pub_date.
if self.status == "draft" and self.pub_date is not None:
raise ValidationError(
{"pub_date": _("Draft entries may not have a publication date.")}
)
...
Má bhraitheann tú earráidí i réimsí iolracha le linn ``Model.clean () ``, is féidir leat ainmneacha réimse mapála foclóra a chur ar earráidí freisin:
raise ValidationError(
{
"title": ValidationError(_("Missing title."), code="required"),
"pub_date": ValidationError(_("Invalid date."), code="invalid"),
}
)
Ansin, seiceálfaidh ``full_clean () ``srianta uathúla ar do mhúnla.
- Model.validate_unique(exclude=None)Link to this definition
<django.db.models.Options.unique_together>Tá an modh seo cosúil le:meth: ~Model.Clean_Fields, ach bailíochnaíonn sé srianta uathúlachta atá sainmhínithe trí:attr: .field.unique, :attr: .field.unique_for_date, :attr: .field.unique_for_year, nó r: Meta.unique_Together `ar do mhúnla in ionad luachanna réimse aonair. Ligeann an argóint roghnach ``eisiam` duit taca` d'ainmneacha réimse a sholáthar chun eisiamh ó bhailíochtú. Ardóidh sé a:exc: ~django.core.exceptions.validationError má theipeann ar aon réimsí bailíochtú.
<django.db.models.Options.constraints>:class: ~Django.db.Models.UniqueConstraintna sainmhínithe in:attr: Meta.Constraint bailíochtaí:meth: Model.validate_restricints.
Tabhair faoi deara má sholáthraíonn tú argóint exclude do validate_unique () `, ní sheiceálfar srian aon cheann:attr: ~django.db.models.options.unique_together a bhaineann le ceann de na réimsí a chuir tú ar fáil.
Faoi dheireadh, seiceálfaidh ``full_clean () ``aon srianta eile ar do mhúnla.
- Model.validate_constraints(exclude=None)Link to this definition
<django.db.models.Options.constraints>Bailíonn an modh seo na srianta go léir a shainmhínítear in:attr: Meta.Constraints `. Ligeann an argóint roghnach ``eisiam` duit taca` d'ainmneacha réimse a sholáthar chun eisiamh ó bhailíochtú. Ardóidh sé a:exc: ~django.core.exceptions.validationError má theipeann ar aon srianta ar bhailíochtú.
Rudaí a shábháilLink to this heading
Chun réad a shábháil ar ais chuig an mbunachar sonraí, glaoigh ar save () `:
- Model.save(*, force_insert=False, force_update=False, using=DEFAULT_DB_ALIAS, update_fields=None)Link to this definition
- Model.asave(*, force_insert=False, force_update=False, using=DEFAULT_DB_ALIAS, update_fields=None)Link to this definition
Asynchronous version: asave()
Le haghaidh sonraí maidir le húsáid na hargóintí force_insert agus force_update, féach:ref: ref-models-force-insert. Is féidir sonraí faoin argóint update_fields a fháil sa ranna:ref: ref-models-update-fields.
Más mian leat iompar sábhála saincheaptha, is féidir leat an modh “save ()” seo a shárú. Féach: Ref: overriding-model-methods le haghaidh tuilleadh sonraí.
Tá roinnt caoilteachtaí ag an bpróiseas sábhála samhail freisin; féach na codanna thíos.
Eochracha bunscoile uathoibríochLink to this heading
Má tá samhail ag: class: ~django.db.models.autofield - eochair phríomh-mhéadaithe uathoibríoch - ansin ríomhfar agus sábhálfar an luach uathoibríoch sin mar thréith ar do réad an chéad uair a ghlaonn tú ar save () `:
>>> b2 = Blog(name="Cheddar Talk", tagline="Thoughts on cheese.")
>>> b2.id # Returns None, because b2 doesn't have an ID yet.
>>> b2.save()
>>> b2.id # Returns the ID of your new object.
Níl aon bhealach ann a insint cad é luach aitheantais sula nglaonn tú ar ``save () ``, toisc go ríomh do bhunachar sonraí an luach sin, ní ag Django.
Ar mhaithe le áisiúlacht, tá: class: ~django.db.models.autofield ag gach samhail darb ainm id` de réir réamhshocraithe mura sonraíonn tú go sainráite primary_key=true ar réimse i do mhúnla. Féach an doiciméadú le haghaidh: class: ~django.db.models.autofield le haghaidh tuilleadh sonraí.
An mhaoin pkLink to this heading
- Model.pkLink to this definition
Regardless of whether you define a primary key field yourself, or let Django
supply one for you, each model will have a property called pk. It behaves
like a normal attribute on the model, but is actually an alias for whichever
field or fields compose the primary key for the model. You can read and set
this value, just as you would for any other attribute, and it will update the
correct fields in the model.
Luachanna eochair uathoibríoch-phríomhúilLink to this heading
Má tá: class: ~django.db.models.autofield ag samhail ach ba mhaith leat aitheantas réad nua a shainiú go sainráite agus tú ag sábháil, sainmhínigh é go sainráite sula ndéantar é a shábháil, seachas brath ar shannadh uathoibríoch an ID:
>>> b3 = Blog(id=3, name="Cheddar Talk", tagline="Thoughts on cheese.")
>>> b3.id # Returns 3.
>>> b3.save()
>>> b3.id # Returns 3.
Má shannann tú luachanna eochair uathoibríoch de láimh, déan cinnte nach n-úsáideann tú luach príomh-eochair atá ann cheana féin! Má chruthaíonn tú réad nua le luach príomh-eochair follasach atá ann cheana féin sa bhunachar sonraí, glacfaidh Django leis go bhfuil tú ag athrú an taifead atá ann cheana seachas ceann nua a chruthú.
Mar gheall ar an sampla bhlag Cheddar Talk thuas, chuirfeadh an sampla seo an taifead roimhe seo sa bhunachar sonraí:
b4 = Blog(id=3, name="Not Cheddar", tagline="Anything but cheese.")
b4.save() # Overrides the previous blog with ID=3!
Féach Conas a bhfuil a fhios ag Django nuashonrú vs INSERT, thíos, ar an gcúis a tharlaíonn sé seo.
Tá luachanna eochair uathoibríoch a shonrú go sainráite úsáideach den chuid is mó le haghaidh rudaí sábhála móra, nuair a bhíonn tú muiníneach nach mbeidh imbhuailt eochair
Má tá PostgreSQL á úsáid agat, b'fhéidir go mbeadh gá an seicheamh a bhaineann leis an bpríomh-eochair a nuashonrú; féach:ref: manually-specied-autoincrement-pk.
Cad a tharlaíonn nuair a shábháil tú?Link to this heading
Nuair a shábhálann tú réad, déanann Django na céimeanna seo a leanas:
Easaigh comhartha réamh-shábháil. Seoltar an comhartha: Data: ~django.db.models.signals.pre_save, rud a ligeann d'aon fheidhmeanna a éisteann don chomhartha sin rud éigin a dhéanamh.
Réamhphróiseáil na sonraí. Glaítear ar gach réimse:: ~django.db.models.field.pre_save modh chun aon mhodhnú uathoibrithe sonraí a theastaíonn a dhéanamh. Mar shampla, athraíonn na réimsí dáta/ama ``pre_save () ``chun cur i bhfeidhmiú:attr: ~django.db.models.datefield.auto_now_add agus:attr: ~django.db.models.datefield.auto_now.
Ullmhaigh na sonraí don bhunachar sonraí. Iarrtar ar gach réimse:meth: ~django.db.models.field.get_db_prep_save modh a luach reatha a sholáthar i gcineál sonraí is féidir a scríobh chuig an mbunachar sonraí.
Ní theastaíonn ullmhú sonraí ó chuid is mó de na réimsí. Tá cineálacha sonraí simplí, mar shampla sláimhreacha agus teaghráin, 'réidh le scríobh' mar réad Python. Mar sin féin, is minic a éilíonn roinnt modhnú ó chineálacha sonraí níos cast
Mar shampla, úsáideann réimsí: :class: ~django.db.Models.DateField réad Python
datetimechun sonraí a stóráil. Ní stóráilíonn bunachair sonraí rudaídatetime, mar sin caithfear an luach réimse a thiontú ina teaghrán dáta comhlíontach ISO lena chur isteach sa bhunachar sonraí.Cuir na sonraí isteach sa bhunachar sonraí. Tá na sonraí réamhphróiseáilte, ullmhaithe comhdhéanta i ráiteas SQL lena chur isteach sa bhunachar sonraí.
Easaigh comhartha iar-shábháil. Seoltar an comhartha: Data: ~django.db.models.signals.post_save, rud a ligeann d'aon fheidhmeanna a éisteann don chomhartha sin rud éigin a dhéanamh.
Conas a bhfuil a fhios ag Django UPDATE vs INSERTLink to this heading
B'fhéidir gur thug tú faoi deara go n-úsáideann rudaí bunachar sonraí Django an modh céanna save () `chun rudaí a chruthú agus a athrú. Déanann Django achoimrí ar an ngá chun ráitis SQL ``INSERT nó UPDATE a úsáid. Go sonrach, nuair a ghlaonn tú ar save () ``agus nuair a shainmhíníonn príomh-thréith an réad** a:attr: `~django.db.models.field.default nó: attr: ~django.db.models.field.db_default, leanann Django an algartam seo:
If the object's primary key attribute is set to anything except
None, Django executes anUPDATE.Más rud é príomh-thréith eochair an réad* socraithe nó mura ndearna an UPDATE` rud ar bith a nuashonrú (m.sh. má tá eochair phríomhúil socraithe ar luach nach bhfuil sa bhunachar sonraí ann), déanann Django
INSERTa fhorghníomhú.
Má shainmhíníonn príomhthréith an réada a:attr: ~django.db.models.field.default nó: attr: ~django.db.models.field.db_default ansin déanann Django UPDATE a fhorghníomhú más samhail samhail atá ann agus socraítear eochair phríomhúil ar luach atá ann sa bhunachar sonraí. Seachas sin, déanann Django INSERT a fhorghníomhú.
Is é an ceann a thugann anseo ná gur chóir duit a bheith cúramach gan luach príomh-eochair a shonrú go sainráite agus rudaí nua á shábháil, mura féidir leat a ráthú nach bhfuil an luach príomh-eochair neamhúsáidte. Le haghaidh tuilleadh eolais faoin nuans seo, féach `Luachanna uathoibríoch-phríomhúil a shonrú go sainráite `_ thuas agus `INSERT nó UPDATE`a chur i bhfeidhm `_ thíos.
I Django 1.5 agus níos luaithe, rinne Django SELECT nuair a shocraíodh an príomh-thréith eochair. Má aimsigh an SELECT sraith, ansin rinne Django UPDATE, ar shlí eile rinne sé INSERT. Mar thoradh ar an sean-algartam bíonn ceist amháin eile sa chás UPDATE. Tá roinnt cásanna annamh ann nach dtuairiscíonn an bunachar sonraí gur nuashonraíodh sraith fiú má tá sraith sa bhunachar sonraí do phríomhluach an réada. Sampla is ea an truicear PostgreSQL ON UPDATE a fhilleann NULL. I gcásanna den sórt sin is féidir filleadh ar an sean-algartam tríd an rogha: attr: ~django.db.models.options.select_on_save a shocrú go True.
INSERT nó UPDATE a chur i bhfeidhmLink to this heading
In some rare circumstances, it's necessary to be able to force the
save() method to perform an SQL INSERT and not fall back to
doing an UPDATE. Or vice-versa: update, if possible, but not insert a new
row. In these cases you can pass the force_insert=True or
force_update=True parameters to the save() method.
Passing both parameters is an error: you cannot both insert and update at the
same time!
Nuair a úsáidtear: ref: oidhreacht il-tábla <multi-table-inheritance>, is féidir freisin tuipéil de na tuismitheoirí a sholáthar do force_insert d'fhonn ráitis INSERT a chur i bhfeidhm do gach bonn. Mar shampla:
Restaurant(pk=1, name="Bob's Cafe").save(force_insert=(Place,))
Restaurant(pk=1, name="Bob's Cafe", rating=4).save(force_insert=(Place, Rating))
Is féidir leat force_insert= (Models.model,) ``a rith chun ráiteas ``INSERT a chur i bhfeidhm do gach tuismitheoir. De réir réamhshocraithe, ní chuireann force_insert=True ach sraith nua a chur isteach don tsamhail reatha.
Ba chóir go mbeadh sé an-annamh go mbeidh ort na paraiméadair seo a úsáid. Déanfaidh Django an rud ceart beagnach i gcónaí agus déanfaidh sé iarracht a shárú a bheidh mar thoradh ar earráidí atá deacair a rianú. Tá an ghné seo le haghaidh ardúsáide amháin.
Ag baint úsáide as update_fields, cuirfear iallach ar nuashonrú ar an gcéanna le force_update.
tréithe a nuashonrú bunaithe ar réimsí atá annLink to this heading
Uaireanta beidh ort tasc uimhrithíochta simplí a dhéanamh ar réimse, mar shampla an luach reatha a mhéadú nó a laghdú. Bealach amháin chun é seo a bhaint amach is ea an uimhríocht a dhéanamh i Python mar:
>>> product = Product.objects.get(name="Venezuelan Beaver Cheese")
>>> product.number_sold += 1
>>> product.save()
Más é 10 an seanluach number_sold a aisghabhadh ón mbunachar sonraí, ansin scríobhfar luach 11 ar ais chuig an mbunachar sonraí.
Is féidir an próiseas a dhéanamh láidir, :ref: <avoiding-race-conditions-using-f>riocht rása a sheachaint, chomh maith le beagán níos gasta tríd an nuashonrú a chur in iúl i gcoibhneas leis an luach réimse bunaidh, seachas mar shannadh follasach de luach nua. Soláthraíonn Django: class: Abairtí F <django.db.models.F>`chun nuashonrú coibhneasta den chineál seo a dhéanamh. Ag baint úsáide as: aicme: `Abairtí F <django.db.models.F>, cuirtear an sampla roimhe seo in iúl mar:
>>> from django.db.models import F
>>> product = Product.objects.get(name="Venezuelan Beaver Cheese")
>>> product.number_sold = F("number_sold") + 1
>>> product.save()
<topics-db-queries-update>Le haghaidh tuilleadh sonraí, féach an doiciméadú ar:class: F abairtí <django.db.models.F>`agus a n:ref: `úsáid i gceisteanna nuashonraithe.
Sonraítear na réimsí atá le sábháilLink to this heading
Má chuirtear save () ``ar liosta ainmneacha réimse in argóint eochairfhocal ``update_fields, ní dhéanfar ach na réimsí ainmnithe ar an liosta sin a nuashonrú. D'fhéadfadh sé seo a bheith inmhianaithe más mian leat ach réimse amháin nó cúpla réimse a nuashonrú ar réad. Beidh leas beag feidhmíochta ann as cosc a chur ar na réimsí samhlacha go léir a nuashonrú sa bhunachar sonraí. Mar shampla:
product.name = "Name changed again"
product.save(update_fields=["name"])
Is féidir leis an argóint update_fields` a bheith ina aon athraitheacha ina bhfuil teaghráin. Sceapfaidh athraitheach folamh update_fields an sábháil. Déanfaidh luach ``None ``nuashonrú ar gach réimse.
Má shonrófar update_fields, cuirfear iallach ar nuashonrú.
When saving a model fetched through deferred model loading
(only() or
defer()) only the fields loaded
from the DB will get updated. In effect there is an automatic
update_fields in this case. If you assign or change any deferred field
value, the field will be added to the updated fields.
Rudaí a scriosadhLink to this heading
- Model.delete(using=DEFAULT_DB_ALIAS, keep_parents=False)Link to this definition
- Model.adelete(using=DEFAULT_DB_ALIAS, keep_parents=False)Link to this definition
Leagan asincrón: ``adelete () ``
Eisíonn SQL DELETE don réad. Ní scriosann sé seo ach an réad sa bhunachar sonraí; beidh an cás Python ann fós agus beidh sonraí ann ina réimsí fós, ach amháin an príomh-eochair atá socraithe go None. Tugann an modh seo líon na rudaí scriosta agus foclóir le líon na scriosadh in aghaidh an chineál réada ar ais.
Le haghaidh tuilleadh sonraí, lena n-áirítear conas rudaí a scriosadh ar an mórchóir, féach:ref: topics-db-queries-delete.
Más mian leat iompar scriosta saincheaptha, is féidir leat an modh ``delete () ``a shárú. Féach: Ref: overriding-model-methods le haghaidh tuilleadh sonraí.
Uaireanta <multi-table-inheritance>le: ref: oidhreacht il-tábla b'fhéidir gur mhaith leat ach sonraí samhail linbh a scriosadh. Coinneoidh sonraí an tsamhail tuismitheora a shonrú keep_parents=True.
Rudaí piceálaLink to this heading
Nuair a dhéanann tú: mod: pickle samhail, piciltear a staid reatha. Nuair a dhíphicfidh tú é, beidh an samhail samhail ann i láthair na huaire a piceáladh é, seachas na sonraí atá sa bhunachar sonraí faoi láthair.
Modhanna samhail eileLink to this heading
Tá cuspóirí speisialta ag cúpla modh réad.
``__str__ () `Link to this heading
- Model.__str__()Link to this definition
Glaítear ar an modh __str__ () ``aon uair a ghlaonn tú ``str () ar réad. Úsáideann Django ``str (obj) ``i roinnt áiteanna. Go háirithe, rud a thaispeáint ar shuíomh riaracháin Django agus mar an luach a cuireadh isteach i dteimpléad nuair a thaispeánann sé réad. Dá bhrí sin, ba cheart duit léiriú deas, inléite don duine ar an tsamhail a thabhairt ar ais i gcónaí ón modh ``__str__ () ``.
Mar shampla:
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
def __str__(self):
return f"{self.first_name} {self.last_name}"
``__eq__ () `Link to this heading
- Model.__eq__()Link to this definition
Sainmhínítear an modh comhionannais ionas go measfar cásanna a bhfuil an príomh-luach céanna agus an aicme coincréite céanna cothrom acu, ach amháin nach bhfuil cásanna a bhfuil príomh-phríomhluach “None” comhionann le haon rud seachas iad féin. Maidir le samhlacha seachfhreastalaí, sainmhínítear rang coincréite mar an chéad thuismitheoir neamh-seachfhreastalaí an tsamhail; i gcás gach samhail eile níl ann ach aicme
Mar shampla:
from django.db import models
class MyModel(models.Model):
id = models.AutoField(primary_key=True)
class MyProxyModel(MyModel):
class Meta:
proxy = True
class MultitableInherited(MyModel):
pass
# Primary keys compared
MyModel(id=1) == MyModel(id=1)
MyModel(id=1) != MyModel(id=2)
# Primary keys are None
MyModel(id=None) != MyModel(id=None)
# Same instance
instance = MyModel(id=None)
instance == instance
# Proxy model
MyModel(id=1) == MyProxyModel(id=1)
# Multi-table inheritance
MyModel(id=1) != MultitableInherited(id=1)
``__hash__ () ``Link to this heading
- Model.__hash__()Link to this definition
Tá an modh __hash__ () ``bunaithe ar phríomhluach an cháis. Tá sé go héifeachtach ``hash (obj.pk) ``. Mura bhfuil príomhluach ag an gcás ansin ardófar ``TypeError (ar shlí eile chuirfeadh an modh ``__hash__ () ``luachanna difriúla ar ais roimh agus tar éis an cás a shábháil, ach athródh an: meth: ~ réad. Tá toirmiscthe ar luach __hash__ de shampla i Python.
``get_absolute_url () `Link to this heading
- Model.get_absolute_url()Link to this definition
Sainmhínigh modh ``get_absolute_url () ``chun a insint do Django conas an URL canónach do réad a ríomh. Maidir le glaonna, ba cheart go bhfeicfeadh an modh seo sreang ar ais is féidir a úsáid chun tagairt a dhéanamh don réad thar HTTP.
Mar shampla:
def get_absolute_url(self):
return "/people/%i/" % self.id
While this code is correct and simple, it may not be the most portable way
to write this kind of method. The reverse() function is
usually the best approach.
Mar shampla:
def get_absolute_url(self):
from django.urls import reverse
return reverse("people-detail", kwargs={"pk": self.pk})
Tá áit amháin a úsáideann Django ``get_absolute_url () ``san aip riaracháin. Má shainmhíníonn réad an modh seo, beidh nasc “Amharc ar an láithreán” ag an leathanach eagarthóireachta réada a léimfidh tú go díreach chuig dearcadh poiblí an réada, mar a thugann ``get_absolute_url () ``.
Ar an gcaoi chéanna, úsáideann cúpla giotán eile de Django, mar shampla an: doc: creat beatha syndication ``get_absolute_url () ``nuair </ref/contrib/syndication> a shainmhínítear é. Má tá sé ciallmhar do chásanna do mhúnla go bhfuil URL uathúil ag gach ceann acu, ba cheart duit ``get_absolute_url () `a shainiú.
It's good practice to use get_absolute_url() in templates, instead of
hardcoding your objects' URLs. For example, this template code is bad:
<!-- BAD template code. Avoid! -->
<a href="/people/{{ object.id }}/">{{ object.name }}</a>
Tá an cód teimpléad seo i bhfad níos fearr:
<a href="{{ object.get_absolute_url }}">{{ object.name }}</a>
Is é an loighic anseo ná má athraíonn tú struchtúr URL do chuid rudaí, fiú le haghaidh rud beag cosúil le earráid litrithe a cheartú, nach dteastaíonn uait gach áit a d'fhéadfaí an URL a chruthú a rianú. Sonraigh é uair amháin, i `get_absolute_url () ``agus glaoigh do chód eile go léir ar an áit amháin sin.
Modhanna sampla breiseLink to this heading
In addition to save(), delete(), a model object
might have some of the following methods:
- Model.get_FOO_display()Link to this definition
I gcás gach réimse a bhfuil: attr: ~django.db.models.field.choices tacar aige, beidh modh get_foo_display () ``ag an réad, áit a bhfuil `FOO ainm an réimse. Tugann an modh seo luach “inléite don duine” an réimse ar ais.
Mar shampla:
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=2, choices=SHIRT_SIZES)
>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'
- Model.get_next_by_FOO(**kwargs)Link to this definition
- Model.get_previous_by_FOO(**kwargs)Link to this definition
<django.db.models.Field.null>I gcás gach duine: ~Django.db.Models.DateField agus:class: ~Django.db.Models.DateTimeField nach bhfuil aith:attr: Null=True `, beidh modhanna ``Get_NEXT_BY_FOO () ``agus ``GET_PREVIOUS_BY_FOO ()` Is é ``ainm an réimse. Tugann sé seo an chéad rud eile agus roimhe seo ar ais maidir leis an réimse dáta, ag ardú:: exc: ~django.db.models.model.doesNotExist eisceacht nuair is cuí.
Déanfaidh an dá mhodh seo a gceisteanna ag baint úsáide as an mbainisteoir réamhshocraithe don tsamhail. <field-lookups>Más gá duit aithris a dhéanamh ar scagadh a úsáideann bainisteoir saincheaptha, nó más mian leat scagadh saincheaptha aonuaire a dhéanamh, glacann an dá mhodh le hargóintí eochairfhocal roghnacha freisin, ar chóir go mbeadh san fhormáid a thuairiscítear in:ref: Lookups allamui.
Tabhair faoi deara, i gcás luachanna dáta comhionanna, úsáidfidh na modhanna seo an príomh-eochair mar bhriseadh ceangail. Ráthaíonn sé seo nach ndéantar aon taifid a scipeáil nó a dhúbailt. Ciallaíonn sé sin freisin nach féidir leat na modhanna sin a úsáid ar rudaí neamhshábháilte.
Tréithe eileLink to this heading
_stáitLink to this heading
- Model._stateLink to this definition
Tagraíonn an tréith
_state ``do réad ``ModelStatea rianaíonn saolré an tsamhail shampla.Tá dhá thréith ag an réad
ModelState:Adding, bratach atáTruemura sábháladh an tsamhail chuig an mbunachar sonraí go fóill, agus db`, teaghrán a thagraíonn don ainm bunachar sonraí a luchtadh uaidh nó a shábháiltear leis.Tá Adding=true` agus
db=noneag cásanna nua-ionchasacha, ós rud é nach bhfuil siad fós le sábháil. Beidh Adding=False` agusdbsocraithe ar ainm an bhunachar sonraí gaolmhar ar chásanna a gheobhaidh óQuerySet.
_is_pk_set()Link to this heading
- Model._is_pk_set()Link to this definition
The _is_pk_set() method returns whether the model instance's pk is set.
It abstracts the model's primary key definition, ensuring consistent behavior
regardless of the specific pk configuration.