Creat na cineálacha ábhairLink to this heading

Cuimsíonn Django feidhmchlár a:mod: ~django.contrib.contenttypes atá in ann na samhlacha go léir atá suiteáilte i do thionscadal Django faoi thiomáint a rianú, ag soláthar comhéadan cineálach ardleibhéil chun oibriú le do mhúnlaí.

ForbhreathnúLink to this heading

I gcroílár an fheidhmchláir contenttypes tá an tsamhail:class: ~django.contrib.contentTypes.Models.contentType, a chónaíonn ag Django.Contrib.ContentTypes.Models.ContentType. Léiríonn agus stóráil cásanna de:class: ~django.contrib.contentTypes.Models.ContentType faisnéis faoi na samhlacha atá suiteáilte i do thionscadal, agus cruthaítear cásanna nua de:class: ~Django.Contrib.ContentTypes.Models.ContentType go huathoibríoch aon uair a shuiteáiltear samhlacha nua.

Tá modhanna ag cásanna de:class: ~django.contrib.contentTypes.Models.ContentType chun na ranganna samhail a léiríonn siad a thabhairt ar ais agus chun rudaí a fhiosrú ó na samhlacha sin. :class: ~django.contrib.contentTypes.Models.contentType tá a:ref: bainisteoir saincheapaithe freisin a chuireann modhanna chun oibriú le:class: ~django.contrib.contentTypes.Models.contentType agus chun cásanna de:class: `~django.contrib.contentTypes.Models.contentType <custom-managers>`a fháil do mhúnla áirithe.

Is féidir caidreamh idir do mhúnlaí agus:class: ~django.contrib.contentTypes.Models.contentType a úsáid freisin chun caidrimh “cineálacha” a chumasú idir sampla de cheann de do mhúnlaí agus cásanna d'aon mhúnla atá suiteáilte agat.

Creat na cineálacha ábhair a shuiteáilLink to this heading

Tá an creat cineálacha ábhair san áireamh sa liosta réamhshocraithe:setting: INSTALLED_APPS a chruthaigh django-admin startproject, ach má bhain tú é nó má shocraigh tú do liosta:setting: INSTALLED_APPS de láimh, is féidir leat é a chumasú trí django.contrib.contenttypes' a chur le d':setting: INSTALLED_APPS `socrú.

De ghnáth is smaoineamh maith é creat na cineálacha ábhair a shuiteáil; éilíonn roinnt d'fheidhmchláir cuabháilte eile Django é:

  • Úsáideann an feidhmchlár riaracháin é chun stair gach réad a cuireadh leis nó a athraigh tríd an gcomhéadan riaracháin a logáil.

  • Django's:mod: Úsáideann `creat fíordheimhniúcháin <django.contrib.auth>`é chun ceadanna úsáideora a cheangal le samhlacha ar leith.

An tsamhail ContentTypeLink to this heading

class ContentTypeLink to this definition

Tá dhá réimse ag gach sampla de:class: ~django.contrib.contentTypes.Models.ContentType a chuireann, le chéile, cur síos uathúil ar mhúnla suiteáilte:

app_labelLink to this definition

Ainm an fheidhmchláir tá an tsamhail mar chuid de. Tógtar é seo ó:attr: app_label tréith an tsamhail, agus ní chuimsíonn sé ach an cuid deireanaí* de chonair allmhairithe Python an fheidhmchláir; django.contrib.contenttypes, mar shampla, éiríonn u:attr: app_label de contenttypes`.

modelLink to this definition

Ainm an rang samhail.

Ina theannta sin, tá an maoin seo a leanas ar fáil:

nameLink to this definition

Ainm inléite don duine ar an gcineál ábhair. <django.db.models.Field.verbose_name>Tógtar é seo ón tréith: attr: `verbose_name `den tsamhail.

Breathnaímid ar shampla chun a fheiceáil conas a oibríonn sé seo. Má tá an feidhmchlár: mod: ~django.contrib.contenttypes suiteáilte cheana féin, agus ansin cuir:mod: an feidhmchlár láithreáin `le do shuiteáil: `SET <django.contrib.sites>TING: `INSTALLED_APPS agus rith manage.py migrate chun é a shuiteáil, suiteálfar an samhail:class: Django.contrib.sites.models.site i do bhunachar sonraí. In éineacht leis cruthófar sampla nua de:class: ~django.contrib.contentTypes.Models.contentType leis na luachanna seo a leanas:

  • app_label will be set to 'sites' (the last part of the Python path django.contrib.sites).

  • model will be set to 'site'.

Modhanna ar chásanna ContentTypeLink to this heading

Tá modhanna ag gach ceann: Class: ~django.contrib.contentTypes.Models.contentType a ligeann duit a fháil ó a:class: ~django.contrib.contentTypes.Models.contentType sampla don tsamhail a léiríonn sé, nó chun rudaí a aisghabháil ón tsamhail sin:

ContentType.get_object_for_this_type(using=None, **kwargs)Link to this definition

<django.db.models.query.QuerySet.get>Glacann sé tacar d'argóintí bail:ref: lookup <field-lookups-intro>`don tsamhail the:class: `~django.contrib.contentTypes.Models.contentType léiríonn, agus déanaim:meth: a get () cuardach ar an tsamhail sin, ag cur an réad comhfhreagrach ar ais. Is féidir an argóint ``úsáid ``a úsáid chun bunachar sonraí difriúil a shonrú ná an ceann réamhshocraithe.

ContentType.model_class()Link to this definition

Tugann sé an rang samhail a léiríonn this:class: ~django.contrib.contentTypes.Models.contentType sampla.

Mar shampla, d'fhéadfaimis breathnú suas ar:class: ~django.contrib.contentTypes.Models.contentType don tsamhail:class: ~django.contrib.auth.models.user:

Python console
>>> from django.contrib.contenttypes.models import ContentType
>>> user_type = ContentType.objects.get(app_label="auth", model="user")
>>> user_type
<ContentType: user>

Agus ansin bain úsáid as chun ceist a dhéanamh le haghaidh áirithe: class: ~django.contrib.auth.models.user, nó chun rochtain a fháil ar an rang samhail User:

Python console
>>> user_type.model_class()
<class 'django.contrib.auth.models.User'>
>>> user_type.get_object_for_this_type(username="Guido")
<User: Guido>

Le chéile, cumasaíonn :meth: ~django.contrib.contenttypes.models.contenttype.get_object_for_this_type agus:meth: ~django.contrib.contenttypes.models.contenttype.model_class dhá chás úsáide thar a bheith tábhachtach:

  1. Ag baint úsáide as na modhanna seo, is féidir leat cód cineálach ardleibhéil a scríobh a dhéanann ceisteanna ar aon mhúnla suiteáilte - in ionad rang samhail amháin a iompórtáil agus a úsáid, is féidir leat cuardach app_label agus model ``model` a chur isteach i a:class: ~django.contrib.contenttypes.models.contentType ag rith, agus ansin oibriú leis an rang samhail nó rudaí a aisghabháil uaidh.

  2. Is féidir leat samhail eile a cheangal la:class: ~django.contrib.contentTypes.Models.contentType mar bhealach chun cásanna de a cheangal le ranganna samhail áirithe, agus na modhanna seo a úsáid chun rochtain a fháil ar na ranganna samhail sin.

Baineann roinnt de na feidhmchláir cuabháilte Django úsáid as an teicníc deireanach sin. Mar shampla, :class: an córas ceadanna <django.contrib.auth.models.Permission>`i gcreat fíordheimhnithe Django úsáideann samhail a:class: `~django.contrib.auth.models.permission le eochair eachtrach chuig:class: ~django.contrib.contentTypes.Models.ContentType; is féidir leis an iontráil blog a chur leis” nó “is féidir scéal nuachta a scriosadh”.

An ContentTypeManagerLink to this heading

class ContentTypeManagerLink to this definition

ContentType also has a custom manager, ContentTypeManager, which adds the following methods:

clear_cache()Link to this definition

Clears an internal cache used by ContentType to keep track of models for which it has created ContentType instances. You probably won't need to call this method in application code yourself; Django will call it automatically when it's needed.

You may need to clear the cache when testing, to reset between tests, or after preparing test state. For example:

Code
class ContentTypesTests(TestCase):
    def setUp(self):
        ContentType.objects.clear_cache()
        self.addCleanup(ContentType.objects.clear_cache)
get_for_id(id)Link to this definition

Cuardaigh a:class: ~django.contrib.contentTypes.Models.contentType de réir ID. Ós rud é go n-úsáideann an modh seo an taisce roinnte céanna amha:meth: ~django.contrib.contentTypes.Models.contentTypeManager.get_for_model, is fearr an modh seo a úsáid thar an `ContentType.Objects.get (pk=id) `is gnách

get_for_model(model, for_concrete_model=True)Link to this definition

Tógann sé rang samhail nó sampla de mhúnla, agus filleann sé an sampla:class: ~django.contrib.contentTypes.Models.contentType a léiríonn an tsamhail sin. Ligeann for_concrete_model=False an: class: ~django.contrib.contentTypes.Models.contentType de mhúnla seachfhreastalaí a fháil.

get_for_models(*models, for_concrete_models=True)Link to this definition

Glacann sé líon éagsúil ranganna samhail, agus cuireann sé foclóir ar ais ag mapáil na ranganna samhail chuig na cásanna: class: ~django.contrib.contentTypes.Models.contentType a léiríonn iad. for_concrete_models=False ceadaíonn an: class: ~django.contrib.contentTypes.Models.contentType de mhúnlaí seachfhreastalaí a fháil.

get_by_natural_key(app_label, model)Link to this definition

Filleann sé an sampla:class: ~django.contrib.contentTypes.Models.contentType a aithnítear go uathúil ag an lipéad iarratais agus ainm an tsamhail. <topics-serialization-natural-keys>Is é príomhchuspóir an mhodha seo ná: class: ~django.contrib.contentTypes.Models.contentType rudaí le tagairt a thabhairt trí a:ref: `eochair nádúrtha `le linn dísheerialaithe.

The get_for_model() method is especially useful when you know you need to work with a ContentType but don't want to go to the trouble of obtaining the model's metadata to perform a manual lookup:

Python console
>>> from django.contrib.auth.models import User
>>> ContentType.objects.get_for_model(User)
<ContentType: user>

Caidreamh cineálachLink to this heading

Ag cur eochair eachtrach ó cheann de do mhúnlaí féin chuig: class: ~django.contrib.contentTypes.Models.ContentType is féidir le do mhúnla é féin a cheangal go héifeachtach le rang samhail eile, mar atá i sampla an tsamhail: ~django.contrib.auth.models.permission thuas. Ach is féidir dul céim amháin níos faide agus úsáid:class: ~django.contrib.contentTypes.Models.contentType chun caidrimh fíor-chineálacha (ar a dtugtar “polaimorfach” uaireanta) idir samhlacha a chumasú.

Mar shampla, d'fhéadfaí é a úsáid le haghaidh córas clibeála mar seo:

Code
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models


class TaggedItem(models.Model):
    tag = models.SlugField()
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveBigIntegerField()
    content_object = GenericForeignKey("content_type", "object_id")

    def __str__(self):
        return self.tag

    class Meta:
        indexes = [
            models.Index(fields=["content_type", "object_id"]),
        ]

Ní féidir le gnáth:class: ~django.db.models.foreignKey ach “pointe” ar mhúnla amháin eile, rud a chiallaíonn má úsáideann an tsamhail TaggEditem a:class: ~Django.db.Models.ForeignKey bheadh air samhail amháin agus amháin a roghnú chun clibeanna a stóráil dó. Soláthraíonn an feidhmchlár contenttypes cineál réimse speisialta (GenericForeignKey) a oibríonn timpeall air seo agus a ligeann don chaidreamh a bheith le haon mhúnla:

class GenericForeignKeyLink to this definition

Tá trí chuid ann chun a: class a bhunú: ~django.contrib.contentTypes.Fields.GenericForeignKey:

  1. Tabhair do mhúnla a:class: ~django.db.models.foreignKey chuig: class: ~django.contrib.contentTypes.Models.ContentType. Is é “content_type” an gnáthainm don réimse seo.

  2. Give your model a field that can store primary key values from the models you'll be relating to. For most models, this means a PositiveBigIntegerField. The usual name for this field is "object_id".

  3. Tabhair do mhúnla a:class: ~django.contrib.contentTypes.Fields.GenericForeignKey, agus cuir ainmneacha an dá réimse a thuairiscítear thuas air. Má ainmnítear na réimsí seo “content_type” agus “object_id”, is féidir leat é seo a fhágáil - is iad sin na hainmneacha réimse réamhshocraithe: class: ~django.contrib.contentTypes.fields.GenericForeignKey a lorgfaidh.

<django.db.models.Options.indexes>Murab ionann agus don: class: ~django.db.models.foreignKey, cruthaítear innéacs bunachar sonraí not go huathoibríoch ar:class: ~django.contrib.contentTypes.Fields.GenericForeignKey, mar sin moltar duit: attr: `Meta.Indexes `a úsáid chun d'innéacs colún iolrach féin a chur leis. An t-iompar seo: ticéad: `d'fhéadfadh athrú <23435>`sa todhchaí.

for_concrete_modelLink to this definition

Má tá False, beidh an réimse in ann samhlacha seachfhreastalaí a thagairt. Is é réamhshocraithe True. Léiríonn sé seo an argóint for_concrete_model chuig: meth: ~django.contrib.contentTypes.Models.contentTypeManager.get_for_model.

Cuirfidh sé seo ar chumas API cosúil leis an gceann a úsáidtear le haghaidh gnáth:class: ~django.db.models.foreignKey; beidh réimse content_object ag gach TaggEditem` a thugann an réad a bhaineann leis, agus is féidir leat a shannadh don réimse sin nó é a úsáid agus TaggEditem` á chruthú:

Python console
>>> from django.contrib.auth.models import User
>>> guido = User.objects.get(username="Guido")
>>> t = TaggedItem(content_object=guido, tag="bdfl")
>>> t.save()
>>> t.content_object
<User: Guido>

Má scriostar an réad gaolmhar, fanann na réimsí content_type agus object_id socraithe dá luachanna bunaidh agus filleann GenericForeignKey None:

Python console
>>> guido.delete()
>>> t.content_object  # returns None

Mar gheall ar an mbealach:class: ~django.contrib.contentTypes.Fields.GenericForeignKey a chuirtear i bhfeidhm, ní féidir leat réimsí den sórt sin a úsáid go díreach le scagairí (filter () ``agus ``eisiamh ()`, mar shampla) tríd an API bunachar sonraí. Toisc nach gnáth-réad réimse é a:class: ~django.contrib.contentTypes.Fields.GenericForeignKey, ní oibreoidh na samplaí seo:

Python console
# This will fail
>>> TaggedItem.objects.filter(content_object=guido)
# This will also fail
>>> TaggedItem.objects.get(content_object=guido)

Likewise, GenericForeignKeys do not appear in ModelForms.

Caidreamh cineálach ar aisLink to this heading

class GenericRelationLink to this definition
related_query_nameLink to this definition

Níl an gaol ar an réad gaolmhar ar ais leis an réad seo ann de réir réamhshocraithe. Cruthaíonn socrú related_query_name gaol ón réad gaolmhar ar ais leis an gceann seo. Ligeann sé seo fiosrú agus scagadh ón réad gaolmhar.

Má tá a fhios agat cé na samhlacha a bheidh á úsáid agat is minice, is féidir leat caidreamh cineálach “droim” a chur leis freisin chun API breise a chumasú. Mar shampla:

Code
from django.contrib.contenttypes.fields import GenericRelation
from django.db import models


class Bookmark(models.Model):
    url = models.URLField()
    tags = GenericRelation(TaggedItem)

Beidh tréith tags ag gach cás Leabharmharca, ar féidir iad a úsáid chun a TaggEditems` gaolmhara a aisghabháil:

Python console
>>> b = Bookmark(url="https://www.djangoproject.com/")
>>> b.save()
>>> t1 = TaggedItem(content_object=b, tag="django")
>>> t1.save()
>>> t2 = TaggedItem(content_object=b, tag="python")
>>> t2.save()
>>> b.tags.all()
<QuerySet [<TaggedItem: django>, <TaggedItem: python>]>

Is féidir leat add () ``, `create (), nó ``set () ``a úsáid freisin chun caidrimh a chruthú:

Python console
>>> t3 = TaggedItem(tag="Web development")
>>> b.tags.add(t3, bulk=False)
>>> b.tags.create(tag="Web framework")
<TaggedItem: Web framework>
>>> b.tags.all()
<QuerySet [<TaggedItem: django>, <TaggedItem: python>, <TaggedItem: Web development>, <TaggedItem: Web framework>]>
>>> b.tags.set([t1, t3])
>>> b.tags.all()
<QuerySet [<TaggedItem: django>, <TaggedItem: Web development>]>

Scriosfaidh an glao ``remove () ``mórchóir na rudaí samhail sonraithe:

Python console
>>> b.tags.remove(t3)
>>> b.tags.all()
<QuerySet [<TaggedItem: django>]>
>>> TaggedItem.objects.all()
<QuerySet [<TaggedItem: django>]>

Is féidir an modh ``clear () ``a úsáid chun gach rud gaolmhara a scriosadh go mór mar shampla:

Python console
>>> b.tags.clear()
>>> b.tags.all()
<QuerySet []>
>>> TaggedItem.objects.all()
<QuerySet []>

Sainmhínithe:Class: ~django.contrib.contentTypes.Fields.GenericRelation le tacar related_query_name` ceadaíonn fiosrú ón réad gaolmhar:

Code
tags = GenericRelation(TaggedItem, related_query_name="bookmark")

Cumasaíonn sé seo oibríochtaí scagtha, ordaithe agus fiosrúcháin eile ar Bookmark ``ó `TaggEditem:

Python console
>>> # Get all tags belonging to bookmarks containing `django` in the url
>>> TaggedItem.objects.filter(bookmark__url__contains="django")
<QuerySet [<TaggedItem: django>, <TaggedItem: python>]>

Mura gcuireann tú an related_query_name leis, is féidir leat na cineálacha céanna cuardaigh a dhéanamh de láimh:

Python console
>>> bookmarks = Bookmark.objects.filter(url__contains="django")
>>> bookmark_type = ContentType.objects.get_for_model(Bookmark)
>>> TaggedItem.objects.filter(content_type__pk=bookmark_type.id, object_id__in=bookmarks)
<QuerySet [<TaggedItem: django>, <TaggedItem: python>]>

Díreach cosúil:class: ~django.contrib.contentTypes.Fields.GenericForeignKey glacann le hainmneacha na réimsí cineál ábhair agus Object-ID mar argóintí, mar sin freisin: class: ~django.contrib.contentTypes.Fields.GenericRelation; má tá an tsamhail a bhfuil an eochair eachtrach cineálach ag úsáid ainmneacha na réimsí sin, ní mór duit na n-ainmneacha a rith na réimsí agus a: aicme: .GenericRelation á bhunú leis. Mar shampla, má úsáideann an tsamhail TaggEditem dá dtagraítear thuas réimsí darb ainm content_type_fk` agus object_primary_key` chun a eochair eachtrach cineálach a chruthú, ansin caithfear a:class: .GenericRelation ar ais a shainiú mar sin:

Code
tags = GenericRelation(
    TaggedItem,
    content_type_field="content_type_fk",
    object_id_field="object_primary_key",
)

Tabhair faoi deara freisin, má scriosann tú réad a bhfuil a:class: ~django.contrib.contentTypes.Fields.GenericRelation, scriosfar aon rudaí a bhfuil a:class: ~django.contrib.contentTypes.Fields.GenericForeignKey ag díriú air freisin. Sa sampla thuas, ciallaíonn sé seo dá scriosfaí réad Leabharmharc, go scriosfaí aon rudaí TaggEditem ag díriú air ag an am céanna.

Unlike:class: ~Django.db.Models.ForeignKey, :class: ~django.contrib.contentTypes.fields.GenericForeignKey ní ghlacann argóint a:attr: ~django.db.models.foreignKey.on_delete chun an t-iompar seo a shaincheapadh; más mian leat, is féidir leat an cascade-scriosadh a sheachaint gan úsáid: class: ~django.contrib.contentTypes.Fields.GenericRelation, agus is féidir iompar malartach a sholáthar tríd an gcomhartha: data: ~django.db.models.signals.pre_delete.

Caidreamh cineálach agus comhiomlánúLink to this heading

Django's database aggregation API works with a GenericRelation. For example, you can find out how many tags all the bookmarks have:

Python console
>>> Bookmark.objects.aggregate(Count("tags"))
{'tags__count': 3}

Gaol cineálach i bhfoirmeachaLink to this heading

Soláthraíonn an modúl:mod: django.contrib.contenttypes.forms:

  • BaseGenericInlineFormSet

  • Monarcha formset, :func: generic_inlineformset_factory, le húsáid le:class: ~django.contrib.contentTypes.Fields.GenericForeignKey.

class BaseGenericInlineFormSetLink to this definition
generic_inlineformset_factory(model, form=ModelForm, formset=BaseGenericInlineFormSet, ct_field='content_type', fk_field='object_id', fields=None, exclude=None, extra=3, can_order=False, can_delete=True, max_num=None, formfield_callback=None, validate_max=False, for_concrete_model=True, min_num=None, validate_min=False, absolute_max=None, can_delete_extra=True)Link to this definition

Tugann GenericInlineFormSet ar ais ag baint úsáid:func: ~django.forms.models.modelformset_factory.

Ní mór duit ct_field agus fk_field a sholáthar má tá siad difriúil ó na réamhshocraithe, content_type agus object_id faoi seach. Tá paraiméadair eile cosúil leis na paraiméadair atá doiciméadaithe in:func: ~django.forms.models.modelformset_factory agus:func: ~django.forms.models.inlineformset_factory.

Freagraíonn an argóint for_concrete_model` don argóint: ~django.contrib.contentTypes.Fields.GenericForeignKey.for_Concrete_Model ar GenericForeignKey`.

Caidreamh cineálach i riarachánLink to this heading

Soláthraíonn an modúl:mod: django.contrib.contenttypes.admin :class: ~django.contrib.contentTypes.admin.GenericTabularInline agus:class: ~django.contrib.contentTypes.admin.GenericStackedInline (fo-aicm:class: `~Django.Contrib.ContentTypes.ContentTypes.GenericInlineModelAdmin `)

Cuireann na ranganna agus na feidhmeanna seo ar chumas caidreamh cineálach a úsáid i bhfoirmeacha agus an riarachán. </topics/forms/modelforms> <using-generic-relations-as-an-inline>Féach an doiciméadach:doc: model formset agus:ref: `admin `le haghaidh tuilleadh eolais.

class GenericInlineModelAdminLink to this definition

Oidhreacht an aicme:Class: ~django.contrib.contentTypes.admin.GenericInlineModelAdmin gach airíonna ó aicme:class: ~django.contrib.admin.inlineModelAdmin aicme. Mar sin féin, cuireann sé cúpla ceann féin leis chun oibriú leis an ngaol cineálach:

ct_fieldLink to this definition

Ainm an: aicme: ~django.contrib.contentTypes.Models.contentType eochair réimse eachtrach ar an tsamhail. Réamhshocraithe go content_type.

ct_fk_fieldLink to this definition

Ainm an réimse sláimhir a léiríonn ID an réad gaolmhar. Réamhshocraithe go object_id.

class GenericTabularInlineLink to this definition
class GenericStackedInlineLink to this definition

Fo-aicmí de:class: GenericInlineModelAdmin le leagan amach cruachta agus táblaí, faoi seach.

``GenericPrefetch () ``Link to this heading

class GenericPrefetch(lookup, querysets, to_attr=None)Link to this definition

Tá an cuardach seo cosúil le Prefetch () ``agus níor chóir é a úsáid ach ar ``GenericForeignKey. Glacann an argóint Querysets le liosta de na ceisteanna, gach ceann acu le haghaidh Contenttype difriúil. Tá sé seo úsáideach do GenericForeignKey` le sraith torthaí neamh-aonchineálach.

Python console
>>> from django.contrib.contenttypes.prefetch import GenericPrefetch
>>> bookmark = Bookmark.objects.create(url="https://www.djangoproject.com/")
>>> animal = Animal.objects.create(name="lion", weight=100)
>>> TaggedItem.objects.create(tag="great", content_object=bookmark)
>>> TaggedItem.objects.create(tag="awesome", content_object=animal)
>>> prefetch = GenericPrefetch(
...     "content_object", [Bookmark.objects.all(), Animal.objects.only("name")]
... )
>>> TaggedItem.objects.prefetch_related(prefetch).all()
<QuerySet [<TaggedItem: Great>, <TaggedItem: Awesome>]>