মডেল.পি বিভিন্ন ফাইলে বিভক্ত করুন


91

আমি models.pyআমার অ্যাপ্লিকেশনটি কয়েকটি ফাইলে বিভক্ত করার চেষ্টা করছি :

আমার প্রথম অনুমানটি এটি করা ছিল:

myproject/
    settings.py
    manage.py
    urls.py
    __init__.py
    app1/
        views.py
        __init__.py
        models/
            __init__.py
            model1.py
            model2.py
    app2/
        views.py
        __init__.py
        models/
            __init__.py
            model3.py
            model4.py

এই না কাজ, তারপর আমি পাওয়া নেই এই , কিন্তু এই দ্রবণে আমি এখনো একটি সমস্যা আছে, আমি চালানোর python manage.py sqlall app1আমি ভালো কিছু করেছেন:

BEGIN;
CREATE TABLE "product_product" (
    "id" serial NOT NULL PRIMARY KEY,
    "store_id" integer NOT NULL
)
;
-- The following references should be added but depend on non-existent tables:
-- ALTER TABLE "product_product" ADD CONSTRAINT "store_id_refs_id_3e117eef" FOREIGN KEY     ("store_id") REFERENCES "store_store" ("id") DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "product_product_store_id" ON "product_product" ("store_id");
COMMIT;

আমি এই সম্পর্কে খুব নিশ্চিত নই, তবে আমি অংশটি সম্পর্কে চিন্তিত The following references should be added but depend on non-existent tables:

এটি আমার মডেল 1.py ফাইল:

from django.db import models

class Store(models.Model):
    class Meta:
        app_label = "store"

এটি আমার মডেল 3.py ফাইল:

from django.db import models

from store.models import Store

class Product(models.Model):
    store = models.ForeignKey(Store)
    class Meta:
        app_label = "product"

এবং দৃশ্যত কাজ করে তবে আমি মন্তব্যটি পেয়েছি alter tableএবং যদি আমি এটি চেষ্টা করি তবে একই জিনিস ঘটে:

class Product(models.Model):
    store = models.ForeignKey('store.Store')
    class Meta:
        app_label = "product"

সুতরাং, আমি নিজেই রেফারেন্সগুলির জন্য পরিবর্তনটি চালাতে পারি? এটি কি দক্ষিণের সাথে আমার সমস্যা নিয়ে আসতে পারে?


আপনি চেষ্টা করলে মডেল 3-তে কী ঘটে from app1.models.model1 import Store?
জেমস খুরি

উত্তর:


33

আমি নিম্নলিখিতটি করতাম:

myproject/
    ...
    app1/
        views.py
        __init__.py
        models.py
        submodels/
            __init__.py
            model1.py
            model2.py
    app2/
        views.py
        __init__.py
        models.py
        submodels/
            __init__.py
            model3.py
            model4.py

তারপর

#myproject/app1/models.py:
    from submodels/model1.py import *
    from submodels/model2.py import *

#myproject/app2/models.py:
    from submodels/model3.py import *
    from submodels/model4.py import *

তবে, আপনার যদি সঙ্গত কারণ না থাকে তবে মডেল 1 এবং মডেল 2 সরাসরি অ্যাপ 1 / মডেল.পি এবং মডেল 3 এবং অ্যাপল 2 / মডেল.পিতে মডেল 4 রাখুন py

---দ্বিতীয় অংশ---

এটি app1 / submodels / Model1.py ফাইল:

from django.db import models
class Store(models.Model):
    class Meta:
        app_label = "store"

এভাবে আপনার মডেল 3.py ফাইলটি সংশোধন করুন:

from django.db import models
from app1.models import Store

class Product(models.Model):
    store = models.ForeignKey(Store)
    class Meta:
        app_label = "product"

সম্পাদিত, যদি এটি আবার কারও কাছে আসে: কেবলমাত্র এটি করে এমন কোনও প্রকল্পের উদাহরণের জন্য জ্যাঙ্গো-শিডিউল দেখুন। https://github.com/thauber/django-schedule/tree/master/schedule/models https://github.com/thauber/django-schedule/


4
এই উত্তরটির প্রতি শ্রদ্ধা রেখে আমি আবার একটি সমস্যা পেয়েছি যখন from product.models import Productমডেল 2.py এ জাতীয় কিছু তৈরি করুন : আমদানি ত্রুটি: কোনও মডিউল নামক মডেল নেই
ডায়াগিউস 9

68
আপনি প্রতি ফাইল প্রতি এক শ্রেণি বজায় রাখার জন্য এটি করবেন।
worc

50
"কেন" একটি বৃহত models.pyফাইলের আকার হ্রাস করার আকাঙ্ক্ষা হবে। আমি সম্প্রতি এটি করেছি যখন আমার কোডের 15k লাইনের বেশি হয়েছে। দুর্দান্ত লেখার যদিও। প্রক্রিয়া মোটামুটি সহজ। মূল সতর্কতা আপনাকে হ'ল একটি স্পষ্টভাবে অ্যাপ_লাবেল সংজ্ঞায়িত করতে হবে, যেহেতু জ্যাঙ্গো এটিকে ডিফল্টরূপে তাত্ক্ষণিক মডিউল থেকে উত্তোলন করে।
সেরিন

4
২০১ 2016 সালে এটি চেষ্টা করে দেখুন this এই পোস্টের দ্বিতীয় অংশটি এখনও দরকার? আমি ক্লাসগুলি কেবল আলাদা ফাইলগুলিতে সরিয়েছি, আমার লিখেছি __init__.pyএবং সবকিছু ঠিকঠাক কাজ করছে বলে মনে হচ্ছে। আমাকে আমার মডেল ফাইলগুলি সংশোধন করতে হবে না। আমি শেল এবং জ্যাঙ্গো অ্যাডমিন থেকে জিনিসগুলি আনতে এবং তৈরি করতে সক্ষম। আমি এক সপ্তাহের মতো জাঙ্গো চেষ্টা করে যাচ্ছি তাই আমি ভাবছি যে নতুন সংস্করণটি এখন এটি ঘটতে দেয় কিনা?
ভিক

4
@ ভিক: জ্যাঙ্গোর নতুন সংস্করণগুলির সাথে মেটা ক্লাসের অ্যাপ্লিকেশনটির আর প্রয়োজন নেই। Code.djangoproject.com/wiki/CookBookSplitModelsToFiles
জুনিয়াল

149

জ্যাঙ্গো ১.৯-এর যে কোনও ব্যক্তির জন্য, এখন ক্লাস মেটা ডেটা সংজ্ঞায়িত না করে ফ্রেমওয়ার্ক দ্বারা এটি সমর্থিত।

https://docs.djangoproject.com/en/1.9/topics/db/models/#organizing-models-in-a-package

দ্রষ্টব্য: জ্যাঙ্গো 2 এর জন্য, এটি এখনও একই

manage.py startappকমান্ড একটি অ্যাপ্লিকেশন গঠন করে একটি models.py ফাইল অন্তর্ভুক্ত সৃষ্টি করে। আপনার যদি অনেক মডেল থাকে তবে তাদের পৃথক ফাইলে সংগঠিত করা কার্যকর হতে পারে।

এটি করতে, একটি মডেল প্যাকেজ তৈরি করুন। মডেল.পাই সরান এবং আপনার মডেলগুলি সঞ্চয় করার জন্য myapp/models/একটি __init__.pyফাইল এবং ফাইলগুলি দিয়ে একটি ডিরেক্টরি তৈরি করুন। আপনাকে অবশ্যই __init__.pyফাইলগুলিতে মডেলগুলি আমদানি করতে হবে।

সুতরাং, আপনার ক্ষেত্রে, যেমন একটি কাঠামোর জন্য

app1/
    views.py
    __init__.py
    models/
        __init__.py
        model1.py
        model2.py
app2/
    views.py
    __init__.py
    models/
        __init__.py
        model3.py
        model4.py

আপনার কেবল করা দরকার

#myproject/app1/models/__init__.py:
from .model1 import Model1
from .model2 import Model2

#myproject/app2/models/__init__.py:
from .model3 import Model3
from .model4 import Model4

সমস্ত ক্লাস আমদানির বিরুদ্ধে একটি নোট:

স্পষ্টভাবে প্রতিটি মডেল ব্যবহারের পরিবর্তে আমদানি from .models import *করার ক্ষেত্রে নামস্থান বিশৃঙ্খলা না করা, কোডকে আরও পাঠযোগ্য করে তোলা এবং কোড বিশ্লেষণ সরঞ্জামগুলি দরকারী রাখার সুবিধা রয়েছে।


6
যদি কেউ যদি এটি এখনও আপ টু ডেট জ্যাঙ্গো সঙ্গে 2.0 এর ভাবছি হয় docs.djangoproject.com/en/2.0/topics/db/models/...
NaturalBornCamper

7
দ্রষ্টব্য: আপনি যখন শুরু করেছিলেন models.pyএবং পরে মাইগ্রেশন করতে চান এটি সাধারণত সঠিকভাবে কাজ করে না ।
সেক্ষেত্রে

এখনও সেরা উত্তর। এটি এখনও 2.1+ এ কাজ করে তা নিশ্চিত করতে পারে
রাইস

4
জ্যাঙ্গো ৩.০ এ @uegegeist দ্বারা চিহ্নিত সমস্যাটি আমি দেখতে পাচ্ছি না।
ক্রেমের

11

আপনি যে বিষয়ে জিজ্ঞাসা করছেন ঠিক তার জন্য আমি একটি টিউটোরিয়ালটি এসেছি, আপনি এটি এখানে দেখতে পারেন:

http://paltman.com/breaking-apart-models-in-django/

সম্ভবত একটি প্রাসঙ্গিক মূল বিষয় - আপনি স্থানান্তরিত ক্লাসগুলি তাদের নিজস্ব টেবিলে ফিরিয়ে আনতে মেটা বর্গের db_table ক্ষেত্রটি ব্যবহার করতে চাইতে পারেন।

আমি নিশ্চিত করতে পারি যে এই পদ্ধতিটি জ্যাঙ্গো ১.৩ এ কাজ করছে


এই লিঙ্কটি একটি 404 দেয়
ব্রায়ান ওকলে

1

সবচেয়ে সহজ পদক্ষেপ:

  1. আপনার অ্যাপে মডেল ফোল্ডার তৈরি করুন (ফোল্ডারের নামটি মডেল হওয়া উচিত )
  2. অ্যাপ্লিকেশন ডিরেক্টরি থেকে মডেল.পি ফাইলটি মুছুন (ফাইলটি মুছে ফেলার সময় ব্যাকআপ করুন)
  3. এবং মডেল ফোল্ডারে init .py ফাইল তৈরির পরে
  4. এবং init .py ফাইলের পরে একটি লাইন লিখুন
  5. এবং আপনার মডেল ফোল্ডারে মডেল ফাইল তৈরির পরে এবং মডেল ফাইলের নাম শ্রেণীর নামের মতো হওয়া উচিত, যদি শ্রেণীর নাম 'কর্মচারী' মডেল ফাইলের চেয়ে 'কর্মচারী.পি'র মতো হওয়া উচিত
  6. মডেল ফাইলের পরে আপনার ডাটাবেস টেবিলটিকে মডেল.পি ফাইলের মতো লেখার মতো সংজ্ঞায়িত করুন
  7. এটি সংরক্ষণ করুন

আমার কোড: django_adminlte.models.employee আমদানি কর্মচারী থেকে

আপনার জন্য: অ্যাপ_নাম থেকে । মডেলগুলি। মডেল_ফ ाइल_ নাম_একটিই আমদানি করুন ক্লাস_নাম_যে_সেই_ফাইন_ইন_মডেল_ফাইল


__init__.py

from django_adminlte.models.employee import Employee

model/employee.py (employee is separate model file)

from django.db import models

class Employee(models.Model):
eid = models.CharField(max_length=20)
ename = models.CharField(max_length=20)
eemail = models.EmailField()
econtact = models.CharField(max_length=15)

class Meta:
    db_table = "employee"
    # app_label = 'django_adminlte'
    
def __str__(self):
    return self.ename

4
তিনি ঠিক এটিই ঠিক করার চেষ্টা করছেন। এই সমাধানটি RuntimeError ModelX doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.জাজানো ২.x হতে পারে will
র‌্যাডটেক

0

আমি একটি স্ক্রিপ্ট লিখেছিলাম যা দরকারী হতে পারে।

github.com/victorqribeiro/splitDjangoModels

এটি যথাযথ নামকরণ এবং আমদানির সাথে পৃথক ফাইলে মডেলগুলিকে বিভক্ত করে; এটি একটি init ফাইলও তৈরি করে যাতে আপনি একবারে আপনার সমস্ত মডেল আমদানি করতে পারেন।

আমাকে জানতে দা্ও এটা সাহয্য করে কি - না

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.