জ্যাঙ্গোতে ফিক্সচার লোড করার সময় কন্টেন্ট টাইপের সমস্যা রয়েছে


104

কন্টেন্ট টাইপের দ্বন্দ্বের কারণে আমার মাইএসকিউএল ডাটাবেসে জ্যাঙ্গো ফিক্সচারগুলি লোড করতে আমার সমস্যা হচ্ছে। প্রথমে আমি কেবল আমার অ্যাপ থেকে ডেটা ফেলে দেওয়ার চেষ্টা করেছি:

./manage.py dumpdata escola > fixture.json

তবে আমি বিদেশী কী সমস্যাগুলি হারিয়ে ফেলছি, কারণ আমার অ্যাপ্লিকেশন "এসকোলা" অন্যান্য অ্যাপ্লিকেশন থেকে সারণী ব্যবহার করে। আমি এটি না পাওয়া পর্যন্ত আমি অতিরিক্ত অ্যাপ যুক্ত করতে থাকি:

./manage.py dumpdata contenttypes auth escola > fixture.json

আমি যখন পরীক্ষার ফিক্স হিসাবে ডেটা লোড করার চেষ্টা করি তখন সমস্যাটি হ'ল নিম্নলিখিত সীমাবদ্ধতা লঙ্ঘন:

IntegrityError: (1062, "Duplicate entry 'escola-t23aluno' for key 2")

সমস্যাটি দেখে মনে হচ্ছে যে জাঙ্গো বিভিন্ন প্রাথমিক কী মানগুলির সাথে বিষয়বস্তুগুলিকে গতিশীলভাবে পুনরায় তৈরি করার চেষ্টা করছে যা প্রাথমিকের মূল মানগুলির সাথে সংঘাতবদ্ধ। এটি এখানে বাগ দস্তাবেজের মতোই বলে মনে হচ্ছে: http://code.djangoproject.com/ticket/7052

সমস্যাটি হ'ল প্রস্তাবিত কাজটি হ'ল কনটেন্ট টাইপ অ্যাপ্লিকেশনটি যা আমি ইতিমধ্যে করছি তা ডাম্প করা !? কি দেয়? এটি যদি কোনও পার্থক্য করে তবে এখানে ডকুমেন্ট হিসাবে আমার কাছে কিছু কাস্টম মডেলের অনুমতি রয়েছে: http://docs.djangoproject.com/en/dev/ref/models/options/#perifications

উত্তর:


148

manage.py dumpdata --naturalবিদেশী কীগুলির আরও টেকসই প্রতিনিধিত্ব ব্যবহার করবে। জ্যাঙ্গোতে তাদের "প্রাকৃতিক কী" বলা হয়। উদাহরণ স্বরূপ:

  • Permission.codename পক্ষে ব্যবহার করা হয় Permission.id
  • User.username পক্ষে ব্যবহার করা হয় User.id

আরও পড়ুন: "জাজানো বিষয়গুলিকে সিরিয়ালকরণ করা" এর প্রাকৃতিক কী বিভাগ

এর জন্য আরও কিছু দরকারী যুক্তি dumpdata:

  • --indent=4 এটি মানুষের পাঠযোগ্য করে তোলেন।
  • -e sessions সেশন ডেটা বাদ দিন
  • -e admin অ্যাডমিন সাইটে প্রশাসকের ক্রিয়াকলাপের ইতিহাস বাদ দিন
  • -e contenttypes -e auth.Permissionপ্রতি সময় স্কিমা থেকে স্বয়ংক্রিয়ভাবে তৈরি করা হয় এমন বস্তুগুলি বাদ দিন syncdb। কেবল এটির সাথে একসাথে ব্যবহার করুন --naturalঅন্যথায় আপনি খারাপভাবে সাজানো আইডি নম্বর দিয়ে শেষ করতে পারেন।

1
@ স্কাইজুর সবসময় কেন ব্যবহার -e contenttypes -e auth.permissionকরবেন --natural? আমি কেবল --naturalবিকল্প ছাড়াই চেষ্টা করেছি এবং এটি কার্যকর হয়েছে। এছাড়াও এখানে ডকুমেন্টেশন বলছে যে ডাম্পিং auth.permission এবং হলে এই বিকল্পটি ব্যবহার করা উচিত contenttypes
wlnirvana

6
@ উইনিরভানা কারণ আপনি স্ক্র্যাচ থেকে শুরু করে সিঙ্কডিবি করার পরে, নতুন তৈরি ContentTypeএবং Permissionতাদের আগের মতো আইডি পাওয়ার গ্যারান্টি নেই। আপনার ডেটা ডাম্পে এইডস রয়েছে যা আনডার ডাটাবেসে বিভিন্ন বস্তুর উল্লেখ করতে পারে যেখানে আপনি লোডডাটা করবেন। এটি এই কারণগুলির মধ্যে একটি কারণে আপনার পক্ষে কাজ করেছিল: 1) আপনার ডেটাগুলিতে এই বিষয়গুলির কোনও রেফারেন্স ছিল না 2) অনুমতি / কনটেন্ট টাইপের মূল আইডিস সংরক্ষণ করা হয়েছিল 3) আপনার লোডডেটা সফল হয়েছিল তবে বস্তুর কারণে আপনার কাছে আসলে দুর্নীতিগ্রস্থ ডেটা রয়েছে ভুল অবজেক্টের উল্লেখ করে এবং আপনি এখনও এটি সম্পর্কে জানেন না
স্কি

12
পতাকা --naturalএখন --natural-foreign(এবং --natural-primary)
frnhr

16
চূড়ান্ত আদেশটি হতে পারে:manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4 > project_dump.json
পাওলো

4
--naturalকেবল সম্পূর্ণ হ্রাস করা হয়নি, এখন সম্পূর্ণ অপসারণ করা হয়েছে। ব্যবহার করুন --natural-foreignঅথবা --natural-primaryপরিবর্তে।
কোড-শিক্ষানবিশ

35

হ্যাঁ, এটি সত্যিই বিরক্তিকর। কিছুক্ষণের জন্য আমি ফিক্সটি লোড করার আগে কনটেন্ট টাইপ অ্যাপে "ম্যানেজ.পি রিসেট" করে কাজ করেছি (ডাম্পড সংস্করণ থেকে পৃথক হওয়া স্বয়ংক্রিয়ভাবে উত্পাদিত সামগ্রী টাইপস ডেটা থেকে মুক্তি পেতে)। এটি কাজ করেছিল, তবে শেষ পর্যন্ত আমি ঝামেলাতে অসুস্থ হয়ে পড়েছিলাম এবং সরাসরি এসকিউএল ডাম্পের পক্ষে পুরোপুরি ত্যাগ করেছি (অবশ্যই, আপনি ডিবি বহনযোগ্যতা হারাবেন)।

আপডেট - সর্বোত্তম উত্তরটি হ'ল --naturalপতাকাটি ব্যবহার করা dumpdata, নীচের উত্তরে উল্লিখিত হিসাবে। আমি এই উত্তরটি লেখার সময় এখনও এই পতাকাটির অস্তিত্ব ছিল না।


3
আমি এটিতেও চলছিলাম, সামগ্রী টাইপ অ্যাপটি পুনরায় সেট করা আমার পক্ষেও কাজ করেছিল। বখশিশের জন্য ধন্যবাদ!
Beau

আপনি কীভাবে এগুলি পুনরায় সেট করলেন? টেস্ট কেস ক্লাসে? দয়া করে আমাকে একটি উদাহরণ দিন
ওলেগ তারাসেনকো

4
আমি ইউনিটসেটের জন্য ফিক্সচার ব্যবহার করি না, আমি সাধারণত একটি সেটআপ () পদ্ধতিতে ORM ব্যবহার করে পরীক্ষার ডেটা তৈরি করি কারণ পরীক্ষাগুলির সাথে সুসংগত রাখা আরও সহজ। সুতরাং টেস্টকেস ক্লাসে আমার কখনই এটি করা হয়নি, যদিও আমি নিশ্চিত যে আপনি জাঙ্গোর টেস্ট কেস ক্লাসের কোডটি ঘুরে দেখেন তবে কীভাবে পুনরায় সেট করতে হবে তা সিঙ্কডিবি এবং সাবক্লাসে ফিক্সিং লোড করার পূর্বে আপনি বের করতে পারেন। আমার জন্য এটি "./manage.py লোডডাটা মাই_ফিজারেশন" এর আগে একটি "" বাশ স্ক্রিপ্টে "./manage.py রিসেট সামগ্রী টাইপগুলি ছিল।
কার্ল মায়ার

32

ফিক্সচার তৈরি করার সময় কন্টেন্ট টাইপগুলি এড়িয়ে যাওয়ার চেষ্টা করুন:

./manage.py dumpdata --exclude contenttypes > fixture.json

এটি ইউনিট পরীক্ষার জন্য একই পরিস্থিতিতে আমার পক্ষে কাজ করেছে, বিষয়বস্তু সম্পর্কিত আপনার অন্তর্দৃষ্টি সত্যই সহায়তা করেছে!


31

এখানে পুরানো উত্তরগুলি ... 2017 সালের হিসাবে সেরা উত্তরটি হল:

manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 4

11

আমি মাইএসকিউএল ব্যবহার করছিলাম না বরং পরিবর্তে লাইভ সার্ভার থেকে কিছু ডেটা স্ক্লাইটে আমদানি করছিলাম। কার্য contenttypesসম্পাদন করার আগে অ্যাপ্লিকেশন ডেটা সাফ করা loaddata:

from django.contrib.contenttypes.models import ContentType
ContentType.objects.all().delete()
quit()

এবং তারপর

python manage.py loaddata data.json

django.core.exferences.ImproperlyConfigured: INSTALLED_APPS সেটিংয়ের জন্য অনুরোধ করা হয়েছে, তবে সেটিংস কনফিগার করা হয়নি। সেটিংস অ্যাক্সেস করার আগে আপনাকে অবশ্যই পরিবেশের পরিবর্তনশীল DJANGO_SETTINGS_MODULE বা কল করুন सेटिंगস কনফিগার () কল করতে হবে।
বার্নে

এটি সম্ভবত কাস্টম ম্যানেজমেন্ট কমান্ডের হ্যান্ডেলের মধ্যে সবচেয়ে ভাল কাজ করবে।
বার্নে

10

আমার ডাম্প ফাইলটি লোড করার আগে ইউনিট পরীক্ষা থেকে কনটেন্টটিপস অ্যাপটি পুনরায় সেট করে আমি আমার পরীক্ষার ক্ষেত্রে এই সমস্যাটি সমাধান করেছি। কার্ল এটি ইতিমধ্যে manage.pyকমান্ডটি ব্যবহার করে পরামর্শ দিয়েছিল এবং আমি কেবল call_commandপদ্ধতিটি ব্যবহার করে একই জিনিসটি করি :

>>> from django.core import management
>>> management.call_command("flush", verbosity=0, interactive=False)
>>> management.call_command("reset", "contenttypes", verbosity=0, interactive=False)
>>> management.call_command("loaddata", "full_test_data.json", verbosity=0)

আমার full_test_data.jsonদৃxture়পত্রে কনটেন্ট টাইপস অ্যাপ্লিকেশন ডাম্প রয়েছে যা পরীক্ষার বাকী ডেটার সাথে মিলে যায়। লোড হওয়ার আগে অ্যাপটিকে পুনরায় সেট করার মাধ্যমে এটি সদৃশ কীটি প্রতিরোধ করে IntegrityError


7
python manage.py dumpdata --natural-primary --exclude=contenttypes --exclude=auth.Permission --exclude=admin.logentry --exclude=sessions.session --indent 4 > initial_data.json

এটি আমার পক্ষে কাজ করে। এখানে আমি আসল মডেলগুলিকে বুট করে সবকিছু বাদ দিচ্ছি।

  • আপনি তৈরি করেছেন এমন মডেলগুলি বাদে অন্য কোনও মডেল যদি আপনি দেখতে পান তবে আপনি সেগুলি নিরাপদে বাদ দিতে পারেন। এই পদ্ধতির একটি অপূর্ণতা হ'ল আপনি লগ ডেটা পাশাপাশি লেখার ডেটা আলগা করুন।

6

যে কোনও বিদেশী কী এবং বহু থেকে বহু সম্পর্কের প্রতিনিধিত্ব করতে আপনাকে প্রাকৃতিক কীগুলি ব্যবহার করতে হবে। তদুপরি, অ্যাপে থাকা সারণী এবং অ্যাপ্লিকেশনটিতে থাকা sessionটেবিলটি বাদ দেওয়া ভাল ধারণা হতে পারে ।sessionslogentryadmin

জাজানো 1.7+

python manage.py dumpdata --natural-foreign --exclude contenttypes --exclude auth.permission --exclude admin.logentry --exclude sessions.session --indent 4 > fixture.json

জ্যাঙ্গো <1.7

python manage.py dumpdata --natural --exclude contenttypes --exclude auth.permission --exclude admin.logentry --exclude sessions.session --indent 4 > fixture.json

জাজানো ডকুমেন্টেশন অনুসারে , --naturalসংস্করণ 1.7 এ অবচয় করা হয়েছে, সুতরাং --natural-foreignপরিবর্তে বিকল্পটি ব্যবহার করা উচিত।

--natural-primaryপতাকাটি পাসের মাধ্যমে ডিসিরিয়ালাইজেশনের সময় এটি গণনা করা যায় বলে আপনি এই বস্তুর ক্রমিক তথ্যতে প্রাথমিক কীটিও বাদ দিতে পারেন ।

python manage.py dumpdata --natural-foreign --natural-primary --exclude contenttypes --exclude auth.permission --exclude admin.logentry --exclude sessions.session --indent 4 > fixture.json

2
./manage.py dumpdata app.Model --natural-foreign

পরিবর্তন হবে

  "content_type": 123

প্রতি

  "content_type": [
    "app_label",
    "model"
  ],

এবং স্থিরতা TestCaseআপাতত কাজ করে


2

জ্যাঙ্গো ২.২.২

python manage.py dumpdata --exclude=contenttypes > datadump.json

এটা আমাকে সাহায্য করেছে


লোডডেটা যখন সমস্যা তৈরি করবে তখন নতুন ডাটাবেসে কন্টেন্ট টাইপের সাথে মেলে না
ইয়াং

1

আমি আর একটি সম্ভাব্য উত্তর দিতে যাচ্ছি যা আমি সবেমাত্র বের করেছিলাম। হতে পারে এটি ওপিকে সাহায্য করবে, সম্ভবত এটি অন্য কাউকে সহায়তা করবে।

আমি একাধিক থেকে অনেকের টেবিল পেয়েছি। এটিতে একটি প্রাথমিক কী এবং অন্যান্য টেবিলের দুটি বিদেশী কী রয়েছে। আমি দেখতে পেয়েছি যে যদি ফিক্সটিতে আমার প্রবেশ রয়েছে তবে যার দুটি বিদেশী কী ইতিমধ্যে একটি আলাদা পিকে সহ টেবিলের অন্য এন্ট্রি হিসাবে একই , এটি ব্যর্থ হবে। এম 2 এম সম্পর্কের টেবিলগুলির দুটি বিদেশী কীগুলির জন্য "একসাথে অনন্য" রয়েছে।

সুতরাং, যদি এটি কোনও এম 2 এম সম্পর্ক ভেঙে চলেছে, তবে এটি যুক্ত করা বিদেশী কীগুলি দেখুন, আপনার ডাটাবেসটি দেখুন এটি ইতিমধ্যে অন্য পিকে-র অধীনে এফকে-র জুড়ি তালিকাভুক্ত রয়েছে কিনা তা দেখুন।


1

এটা সত্যিই, সত্যিই বিরক্তিকর .. আমি প্রতি একক বার এই কামড়েছি।

আমি অন্তর্ভুক্ত বিষয়বস্তু এবং প্রাকৃতিক সহ ডাম্পডাটার চেষ্টা করেছি, আমি সবসময় সমস্যা পাই ..

আমার জন্য যা সবচেয়ে ভাল কাজ করে তা হল truncate table django_content_type;সিঙ্কডিবি-র পরে কেবল একটি কাজ করা এবং তারপরে ডেটা লোড করা।

অবশ্যই প্রাথমিক_ডাটা.জসন অটোলেডিংয়ের জন্য আপনি ফালবুল।


আমার জন্য, লোডডেটার আগে টেবিলটি কেটে নেওয়া কেবল বিভিন্ন ত্রুটি ঘটায়। এই কৌশলটি দিয়ে ভাগ্য নেই।
শ্যাকার

1

আমি কখনও কখনও আগে অনুরূপ ত্রুটি সম্মুখীন হয়েছিল। দেখা গেল যে প্রয়োজনীয় টেবিলগুলি তৈরি করার আগে আমি ফিক্সচারগুলি লোড করার চেষ্টা করছিলাম। তাই আমি:

$ python manage.py makemigrations
$ python manage.py migrate
$ python manage.py loaddata fixtures/initial_data.json

এবং এটি একটি কবজ মত কাজ


0

আমার ক্ষেত্রে আমি পরীক্ষার উদ্দেশ্যে ফিক্সচারটি ব্যবহার করতে auth( ./manage.py dumpddata auth > fixtures/auth.json) থেকে ডেটা ফেলে দিয়েছিলাম ।

বিকাশ অব্যাহত ছিল এবং আমি সংজ্ঞায়িত বেশিরভাগ মডেলগুলি সরিয়ে দিয়েছি models.pyএবং এটি যখন আমি এই বিরক্তিকর সমস্যাটি দেখতে শুরু করি।

আমার সমাধানটি আবার auth.json স্থিতি পুনরায় তৈরি করছিল। এইটি auth.permissionআমার থাকা পুরানো মডেলগুলির সাথে সম্পর্কিত প্রচুর এন্ট্রি সরিয়েছিল ।


0

আমি উপর থেকে প্রতিটি পদ্ধতি চেষ্টা করেছিলাম, কিছুই আমার পক্ষে কাজ করেনি। আমাকে সম্পূর্ণ লেখক মডেলটি বাদ দিতে হবে এবং দুর্দান্ত কাজ করে।

python manage.py dumpdata --natural-primary --exclude=contenttypes --exclude=auth --exclude=admin.logentry --exclude=sessions.session --indent 4 > live.json
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.