मैं Django 1.7 माइग्रेशन का उपयोग करता हूं, और विशेष रूप से, प्रारंभिक डेटा के साथ एक नव निर्मित डेटाबेस को पॉप्युलेट करना चाहता हूं। इस प्रकार, मैं इसके लिए डेटा माइग्रेशन का उपयोग करता हूं। यह इस तरह दिखता है:मैं Django माइग्रेशन के भीतर से सिग्नल कैसे भेज सकता हूं?
@receiver(signals.post_save, sender=django.contrib.auth.models.User)
def add_user_details(sender, instance, created, **kwargs):
if created:
my_app.UserDetails.objects.create(user=instance)
लेकिन:
def populate_with_initial_data(apps, schema_editor):
User = apps.get_model("auth", "User")
new_user = User.objects.create(username="nobody")
class Migration(migrations.Migration):
...
operations = [
migrations.RunPython(populate_with_initial_data),
]
इसी समय, मैं हर नए उपयोगकर्ता के लिए UserDetails
मॉडल का एक उदाहरण करना चाहते हैं यह संकेत प्रवास के बाहर ही काम करता है । कारण यह है कि apps.get_model("auth", "User")
django.contrib.auth.models.User
से काफी अलग है कि कोई सिग्नल नहीं भेजा जाता है। अगर मैं इसे मैन्युअल रूप से करने की कोशिश, इस तरह, यह विफल रहता है:
signals.post_save.send(django.contrib.auth.models.User, instance=julia, created=True)
यह विफल रहता है क्योंकि तब, संकेत हैंडलर एक नईUserDetails
एक ऐतिहासिकUser
को O2O साथ ओर इशारा करते हुए बनाने की कोशिश:
ValueError: Cannot assign "<User: User object>": "UserDetails.user" must be a "User" instance.
बमर।
ठीक है, मैं सिग्नल हैंडलर को सीधे कॉल कर सकता हूं। लेकिन मुझे एक कीवर्ड तर्क (और अन्य ऐतिहासिक वर्गों की आवश्यकता है) में ऐतिहासिक UserDetails
कक्षा उत्तीर्ण करनी थी। इसके अलावा, UserDetails
वाला ऐप इस डेटा माइग्रेशन वाला नहीं है, इसलिए यह एक बदसूरत निर्भरता होगी जो आसानी से टूट सकती है, उदा। यदि UserDetails
ऐप INSTALLED_APPS
से हटा दिया गया है।
तो, क्या यह केवल एक मौजूदा सीमा है जिसे मुझे बदसूरत कोड और फिक्समे टिप्पणी के साथ संबोधित करना है? या डेटा माइग्रेशन से सिग्नल भेजने का कोई तरीका है?
आप इस के लिए एक समाधान मिला? –
हां, signal.post_migrate का उपयोग कर क्योंकि यह * * कहा जाता है। लेकिन इसे अभी भी कोड की आवश्यकता है जो आवश्यक नहीं होना चाहिए। –
आप उत्तर पोस्ट और के रूप में इस सवाल अनुत्तरित Django सवालों के शीर्ष पर बैठा है अपने खुद के जवाब को स्वीकार करना चाहिए। – dotcomly