विषय पर बढ़ें

संकेत

एक संकेत एक तंत्र है जो आपके कोड को ट्रिगर करता है (function/method) जब भी किसी दिए गए प्रकार की घटना ormar में होती है।

इसलिए, आपको चयनित नमूना के दिए गए प्रकार के सिग्नल के लिए रिसीवर को पंजीकृत करने की आवश्यकता है।

प्राप्तकर्ता को परिभाषित करें

नमूना निम्नलिखित उदाहरण दिया गया है:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
आयात डेटाबेस
आयात sqlalchआयात करें

आयात करें


base_ormar_config = ormar। marConfig (
    डेटाबेस = डेटाबेस। डेटाबेस ("sqlite: //db.sqlite"),
    मेटाडेटा = वर्गधर्मी। मेटाडेटा (),
)


कक्षा अल्बूm (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 100)
    is_best_seller: b= ormar। बूलियन (default = False)
    play_count: int = ormar। पूर्णांक (default = 0)

उदाहरण के लिए, आप एक ट्रिगर को परिभाषित कर सकते हैं जो album.is को सेट करता है यदि एल्बम से अधिक 50 बार खेला जाता है।

प्री \ _ अपडेट डेकोरेटर आयात करें और नीचे वर्तमान में उपलब्ध डेकोरेटर/सिग्नल की सूची देखें।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import asyncio

import databases
import ormar
import sqlalchemy
from examples import create_drop_database
from ormar import pre_update

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL),
    metadata=sqlalchemy.MetaData(),
)


class Album(ormar.Model):
    ormar_config = ormar_base_config.copy(
        tablename="albums",
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    is_best_seller: bool = ormar.Boolean(default=False)
    play_count: int = ormar.Integer(default=0)


@pre_update(Album)
async def before_update(sender, instance, **kwargs):
    if instance.play_count > 50 and not instance.is_best_seller:
        instance.is_best_seller = True


@create_drop_database(base_config=ormar_base_config)
async def run_query():
    # here album.play_count ans is_best_seller get default values
    album = await Album.objects.create(name="Venice")
    assert not album.is_best_seller
    assert album.play_count == 0

    album.play_count = 30
    # here a trigger is called but play_count is too low
    await album.update()
    assert not album.is_best_seller

    album.play_count = 60
    await album.update()
    assert album.is_best_seller


asyncio.run(run_query())

अपने फ़ंक्शन को परिभाषित करें।

कृपया ध्यान दें कि प्रत्येक रिसीवर सुविधाएँ:

  • कॉल करने योग्य होना चाहिए
  • प्राप्त-भेजें ऑब्जेक्ट वर्ग के पहले प्रेषक तर्क को स्वीकार करना चाहिए
  • स्वीकार करना चाहिए **Kwarतर्क प्रत्येक ormar में एक तर्क के रूप में भेजा जाता है। सिग्नल किसी भी समय बदले जा सकते हैं, इसलिए आपके फ़ंक्शन को उनकी सेवा करनी चाहिए।
  • यह अतुल्यकालिक होना चाहिए क्योंकि कॉलबैक एकत्र किए जाते हैं और प्रतीक्षा करते हैं।

पूर्व \ _ अद्यतन वर्तमान में प्रेषक के अलावा केवल एक पैरामीटर भेजता है, और यह एक उदाहरण है।

ध्यान दें कि प्री \ _ अपडेट डेकोरेटर प्रेषक पैरामीटर को कैसे स्वीकार करता है, जो एकल नमूना या मॉडल की सूची हो सकती है जिसके लिए आप सिग्नल रिसीवर चलाना चाहते हैं।

वर्तमान में, रिसीवर की रजिस्ट्री में सभी मॉडलों को स्पष्ट रूप से पारित किए बिना सभी मॉडलों के लिए सिग्नल सेट करना संभव नहीं है।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import asyncio

import databases
import ormar
import sqlalchemy
from examples import create_drop_database
from ormar import pre_update

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL),
    metadata=sqlalchemy.MetaData(),
)


class Album(ormar.Model):
    ormar_config = ormar_base_config.copy(
        tablename="albums",
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    is_best_seller: bool = ormar.Boolean(default=False)
    play_count: int = ormar.Integer(default=0)


@pre_update(Album)
async def before_update(sender, instance, **kwargs):
    if instance.play_count > 50 and not instance.is_best_seller:
        instance.is_best_seller = True


@create_drop_database(base_config=ormar_base_config)
async def run_query():
    # here album.play_count ans is_best_seller get default values
    album = await Album.objects.create(name="Venice")
    assert not album.is_best_seller
    assert album.play_count == 0

    album.play_count = 30
    # here a trigger is called but play_count is too low
    await album.update()
    assert not album.is_best_seller

    album.play_count = 60
    await album.update()
    assert album.is_best_seller


asyncio.run(run_query())

!!!ध्यान दें कि रिसीवर को कक्षा स्तर पर परिभाषित किया गया है -> , इसलिए यहां तक कि अगर आप किसी उदाहरण के माध्यम से फ़ंक्शन को कनेक्ट / डिस्कनेक्ट करते हैं, तो यह उस ormar पर सभी संचालन को चलाएगा / बंद कर देगा। मॉडल वर्ग।

कृपया ध्यान दें कि हमारे नए बनाए गए फ़ंक्शन में उदाहरण और उदाहरणों की कक्षाएं हैं, इसलिए आप चाहें तो सिंक के भीतर डेटाबेस प्रश्नों को आसानी से चला सकते हैं।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
import asyncio

import databases
import ormar
import sqlalchemy
from examples import create_drop_database
from ormar import pre_update

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL),
    metadata=sqlalchemy.MetaData(),
)


class Album(ormar.Model):
    ormar_config = ormar_base_config.copy(
        tablename="albums",
    )

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)
    is_best_seller: bool = ormar.Boolean(default=False)
    play_count: int = ormar.Integer(default=0)


@pre_update(Album)
async def before_update(sender, instance, **kwargs):
    if instance.play_count > 50 and not instance.is_best_seller:
        instance.is_best_seller = True


@create_drop_database(base_config=ormar_base_config)
async def run_query():
    # here album.play_count ans is_best_seller get default values
    album = await Album.objects.create(name="Venice")
    assert not album.is_best_seller
    assert album.play_count == 0

    album.play_count = 30
    # here a trigger is called but play_count is too low
    await album.update()
    assert not album.is_best_seller

    album.play_count = 60
    await album.update()
    assert album.is_best_seller


asyncio.run(run_query())

आप सिग्नल डेकोरेटर को मॉडल की एक सूची पास करके एक ही बार में कई मॉडल के लिए एक ही रिसीवर को परिभाषित कर सकते हैं।

1
2
3
4
# एक डमी डिबग फ़ंक्शन को परिभाषित करें
@ प्री_अपडेट ([Album, Track])
अद्यतन से पहले Ac def (प्रेषक, उदाहरण, ** kwargs):
    प्रिंट (f "{sender.get_name()}:{instance.model_dump_json()}:{kwargs}")

बेशक, आप एक ही सिग्नल और नमूना के लिए कई फ़ंक्शन भी बना सकते हैं। उनमें से प्रत्येक प्रत्येक सिग्नल पर चलेगा।

1
2
3
4
5
6
7
@pre_update (एल्बम)
अद्यतन से पहले Ac def (प्रेषक, उदाहरण, ** kwargs):
    प्रिंट (एफ) "{sender.get_name()}यह भी देखें: {instance.model_dump_json()}यह भी देखें: {kwargs}")

@pre_update (एल्बम)
_ update2 से पहले Ac def (प्रेषक, उदाहरण, ** kwargs):
    प्रिंट (f' अपडेट करने के बारे में {sender.get_name()} पीके के साथ: {instance.pk}')

कृपया ध्यान दें कि ormar डेकोरेटर वाक्यात्मक चीनी है, और आप किसी दिए गए नमूना के लिए दिए गए सिग्नल के कार्यों या तरीकों को सीधे कनेक्ट कर सकते हैं। कनेक्ट केवल एक तर्क लेता है - आपका रिसीवर फ़ंक्शन / विधि।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
कक्षा एल्बमऑडिटर:
    D__ init__ (स्व):
        Self.event_type = "ALBUM_INSTANCE"

    Ac def पहले_save (स्व, प्रेषक, उदाहरण, ** kwargs):
        प्रतीक्षा कर रहा है
            ईवेंट_टाइप = एफ "{self.event_type}_SAVE", ईवेंट_लॉग = इंस्टेंस। model_dump_json ()
        ).बचाओ ()

ऑडिटर = एल्बमऑडिटर ()
प्री _ सेव (एल्बम) (ऑडिटर। before _ save)
# ऊपर दिए गए कॉल का एक ही परिणाम है जैसे नीचे दिया गया है
ormar _ config सिग्नल प्री _ सेव कनेक्ट (ऑडिटर before _ save)
#signles उदाहरणों पर भी उजागर होते हैं
एल्बम = अल्बूm (name = 'Miami')
album.signals.pre_save कनेक्ट (ऑडिटर। before _save)

!!! चेतावनी कृपया ध्यान दें कि सिग्नल रिसीवर के संदर्भ को बरकरार रखता है (एक कमजोर संदर्भ के बजाय), इसलिए परिपत्र संदर्भों से बचने के लिए इसे ध्यान में रखें।

रिसीवर डिस्कनेक्ट करें

रिसीवर को डिस्कनेक्ट करने और किसी दिए गए नमूना को चलाने से रोकने के लिए, आपको इसे डिस्कनेक्ट करने की आवश्यकता है।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
@pre_update (एल्बम)
अद्यतन से पहले Ac def (प्रेषक, उदाहरण, ** kwargs):
    अगर इंस्टेंस। play_count> 50 और इंस्टेंट नहीं। is_best_seller:
        स्थापना। is_best_seller = सच

दिए गए मॉडल के लिए सिग्नल से दिए गए फ़ंक्शन को #disconnect करें
एल्बम। ormar_config संकेत। pre_save (before_save)
#signles उदाहरणों पर भी उजागर होते हैं
एल्बम = अल्बूm (name = 'Miami')
Album.signals.pre_save डिस्कनेक्ट करें (before_save)

उपलब्ध संकेत

!!!चेतावनी, कृपया ध्यान दें कि कोई संकेत नहीं भेजा जाएगा।

1
2
3
4
*  थोक संचालन (`QuerySet.bulk_create` और `QuerySet.bulk_update`) के रूप में वे गति के लिए डिज़ाइन किए गए हैं।

*  Queryतालिका स्तर संचालन (`QuerySet.update` और `QuerySet.delete`) जैसा कि वे अंतर्निहित तालिकाओं पर चलते हैं 
(कच्चे sql अपडेट / डिलीट ऑपरेशन की तरह अधिक) और विशिष्ट उदाहरण नहीं हैं।

पूर्व-बचत

pre_save(sender: Type["Model"], instance: "Model")

Model.save भेजें () और Mo.() तरीके।

प्रेषक एक ormar है। मॉडल वर्ग, सहेजे जाने वाले नमूना का एक उदाहरण।

बचाने के बाद

post_save(sender: Type["Model"], instance: "Model")

Model.save भेजें () और Mo.() तरीके।

प्रेषक एक ormar है। मॉडल वर्ग, एक सहेजे गए नमूना का एक उदाहरण।

पूर्व-अद्यतन

pre_update(sender: Type["Model"], instance: "Model")

Mo.() विधि को भेजा गया।

प्रेषक एक ormar है। मॉडल वर्ग, अद्यतन किए जाने वाले नमूना का एक उदाहरण।

अपडेट के बाद

post_update(sender: Type["Model"], instance: "Model")

Mo.() विधि को भेजा गया।

प्रेषक एक ormar है। मॉडल वर्ग, एक अद्यतन नमूना का एक उदाहरण।

प्री-डिलीट

pre_delete(sender: Type["Model"], instance: "Model")

Model.save भेजें () और Mo.() तरीके।

प्रेषक एक ormar है। मॉडल वर्ग, हटाए जाने वाले नमूना का एक उदाहरण।

हटाने के बाद

post_delete(sender: Type["Model"], instance: "Model")

Mo.() विधि को भेजा गया।

प्रेषक एक ormar है। मॉडल वर्ग, हटाए जा रहे नमूना का एक उदाहरण।

पूर्व-संबंध जोड़

pre_relation_add(sender: Type["Model"], instance: "Model", child: "Model", relation_name: str, passed_args: Dict)

मॉडल.नाम भेजता है () कई-से-कई संबंधों की विधि और विदेशी कुंजी संबंध के उलट।

प्रेषक - प्रेषक वर्ग, उदाहरण - संबंधित नमूना का उदाहरण जोड़ें, बच्चे - नमूना जोड़ा जा रहा है, संबंध \ _ नाम - बच्चे को जोड़ने के लिए संबंध का नाम, सिग्नल जोड़ने के लिए भी पारित किया गया \ _ kwar- kwarका शब्दकोश जोड़ने के लिए पारित किया गया ()

पोस्ट रिलेशनशिप ऐड

post_relation_add(sender: Type["Model"], instance: "Model", child: "Model", relation_name: str, passed_args: Dict)

मॉडल.नाम भेजता है () कई से कई संबंधों की विधि और विदेशी कुंजी संबंध के उलट।

प्रेषक - प्रेषक वर्ग, उदाहरण - संबंधित नमूना का उदाहरण जोड़ें, बच्चे - नमूना जोड़ा जा रहा है, संबंध \ _ नाम - बच्चे को जोड़ने के लिए संबंध का नाम, सिग्नल जोड़ने के लिए भी पारित किया गया \ _ kwar- kwarका शब्दकोश जोड़ने के लिए पारित किया गया ()

पूर्व-संबंध विलोपन

pre_relation_remove(sender: Type["Model"], instance: "Model", child: "Model", relation_name: str)

मॉडल.नाम भेजता है () कई-से-कई संबंधों की विधि और विदेशी कुंजी संबंध के उलट।

प्रेषक - प्रेषक वर्ग, उदाहरण - संबंधित नमूना का उदाहरण जोड़ें, बच्चा - मॉडल जोड़ा जा रहा है, संबंध \ _ नाम - बच्चे को जोड़ने के लिए संबंध का नाम।

रिश्ते मिटाने के बाद

post_relation_remove(sender: Type["Model"], instance: "Model", child: "Model", relation_name: str, passed_args: Dict)

मॉडल.नाम भेजता है () कई-से-कई संबंधों की विधि और विदेशी कुंजी संबंध के उलट।

प्रेषक - प्रेषक वर्ग, उदाहरण - संबंधित नमूना का उदाहरण जोड़ें, बच्चा - मॉडल जोड़ा जा रहा है, संबंध \ _ नाम - बच्चे को जोड़ने के लिए संबंध का नाम।

बैच अपडेट के बाद

post_bulk_update(sender: Type["Model"], instances: List["Model"], **kwargs) , को भेजें Model.objects.bulk_update(List[objects]) विधि।

अपने स्वयं के संकेतों को परिभाषित करें

कृपया ध्यान दें कि आप अपने स्वयं के सिग्नल बना सकते हैं, हालांकि आपको मैन्युअल रूप से उन्हें कोड या सबक्लास ऑर्मर में भेजना होगा। मॉडल और वहां संकेतों को ट्रिगर करें।

एक नया सिग्नल बनाना सरल है। निम्नलिखित उदाहरण आपके \ _ कस्टम \ _ सिग्नल नाम से एक नया सिग्नल सेट करता है।

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
आयात डेटाबेस
आयात sqlalchआयात करें

आयात करें


base_ormar_config = ormar। marConfig (
    डेटाबेस = डेटाबेस। डेटाबेस ("sqlite: //db.sqlite"),
    मेटाडेटा = वर्गधर्मी। मेटाडेटा (),
)


कक्षा अल्बूm (ormar. Model):
    ormar _ config = आधार _ ormar _ config कॉपी ()

    आईडी: int = ormar। पूर्णांक (primary_key = True)
    नाम: str = ormar। स्ट्रिंग (max_length = 100)
    is_best_seller: b= ormar। बूलियन (default = False)
    play_count: int = ormar। पूर्णांक (default = 0)

एल्बम। ormar_config संकेत। आपका_कस्टम_सिग्नल = ormar। सिग्नल ()
ormar _ config आपके _ कस्टम _ सिग्नल कनेक्ट को संकेत देता है (your_ receiver_ name)

वास्तव में, एक सिग्नल की अंतर्निहित परत एक सिग्नलइमिटर उदाहरण है जो ज्ञात संकेतों का एक शब्दकोश रखता है और आपको उन्हें गुणों के रूप में एक्सेस करने की अनुमति देता है। जब आप एक सिग्नल तक पहुंचने की कोशिश करते हैं जो मौजूद नहीं है, तो सिग्नलइमिटर आपके लिए एक सिग्नल बनाएगा।

तो उपरोक्त उदाहरण को सरल बनाया जा सकता है। सिग्नल आपके लिए बनाया जाएगा।

1
ormar _ config आपके _ कस्टम _ सिग्नल कनेक्ट को संकेत देता है (your_ receiver_ name)

अब इस सिग्नल को ट्रिगर करने के लिए, आपको सिग्नल की भेजने की विधि को कॉल करने की आवश्यकता है।

1
इंतजार एल्बम। ormar_config संकेत। your_custom_signel भेजें (sender = Album)

कृपया ध्यान दें कि प्रेषक एकमात्र आवश्यक पैरामीटर है, और यह ओमार मॉडल वर्ग होना चाहिए।

अतिरिक्त मापदंडों को कीवर्ड तर्क के रूप में पारित किया जाना चाहिए।

1
प्रतीक्षा एल्बम। ormar_config संकेत। आपका_कस्टम_सिग्नल भेजें (प्रेषक = एल्बम, my_param = True)