জ্যাঙ্গো সামগ্রীর ধরণগুলি ঠিক কীভাবে কাজ করে?


148

জ্যাঙ্গোর বিষয়বস্তুর ধরণের ধারণাটি উপলব্ধি করতে আমার সত্যিই খুব সমস্যা হচ্ছে। পাইথন কীভাবে জিনিসগুলিতে ঝোঁক দেয় তার বিপরীতে এটি অত্যন্ত হ্যাকিশ এবং শেষ পর্যন্ত মনে হয়। বলা হচ্ছে, আমি যদি জ্যাঙ্গো ব্যবহার করতে যাচ্ছি তবে আমাকে কাঠামোর সীমানার মধ্যে কাজ করতে হবে।

সুতরাং আমি এখানে এসে ভাবছি যে কোনও সামগ্রী কীভাবে কোনও বিষয়বস্তুর ধরণের কাজ করে এবং আপনি কীভাবে এটি বাস্তবায়ন করবেন তার বাস্তব বাস্তব উদাহরণ দিতে পারে। আমি পর্যালোচনা করেছি প্রায় সমস্ত টিউটোরিয়াল (বেশিরভাগ ব্লগে) ধারণাটিটি সত্যই কভার করে না। জ্যাঙ্গো ডকুমেন্টেশন যেখানে ছেড়ে গেছে (কোথাও কোথাও মনে হচ্ছে না) সেগুলি তারা আপ করবে বলে মনে হচ্ছে।


5
আমি বিশ্বাস করি (আমি যদি ভুল হয়েছি তবে কেউ আমাকে সংশোধন করবে) যে বিষয়বস্তুর প্রকারগুলি একটি বহুবর্ষবাদের মতো কিছু, আপনার প্রকল্পের অনেকগুলি বিভিন্ন রূপ থাকতে পারে এমন মডেলগুলি শুরু হওয়ার পরে এটি আপনার হাতে একটি সরঞ্জাম হয়ে উঠবে। ডকুমেন্টেশনের ট্যাগ উদাহরণটি বেশ সোজা এগিয়ে, আপনি আইটেম ট্যাগ করতে সক্ষম হতে চান, তবে তারা কোনও ধরণের আইটেমের সাথে সুনির্দিষ্ট হতে চান না, সমস্ত ট্যাগের পরে পোস্ট, পৃষ্ঠাগুলি, ব্যবহারকারী, পণ্য। বিষয়বস্তুর ধরণের ব্যবহারের সাথে আপনি সম্পর্কিত মডেলটি ঠিক কী তা জেনেও বিভিন্ন বিভিন্ন বাস্তবায়নের সাথে সম্পর্ক তৈরি করতে পারেন।
পেটকোস্টাস

1
ঠিক আছে, সুতরাং আমি যেখানে বিভক্ত হয়েছি তা হ'ল তারা "ট্যাগড আইটেম" নামে একটি ক্লাস করেছে যা আমার কাছে পরিষ্কার ছিল না। আমি তখন নিশ্চিত ছিলাম না যদি ট্যাগড আইটেমটি কোনও স্থানধারক "ব্রিজ" শ্রেণি ছিল। আমার প্রাকৃতিক ঝোঁকটি "শব্দ" নামের একটি সম্পত্তি সহ "ট্যাগ" এর মতো কিছু হত।
ক্রিস শেল্টন

উত্তর:


307

সুতরাং আপনি কি আপনার কাজের জন্য সামগ্রী প্রকারের কাঠামোটি ব্যবহার করতে চান?

নিজেকে এই প্রশ্ন জিজ্ঞাসা করে শুরু করুন: "এই মডেলগুলির কোনওটির কি অন্য মডেলের সাথে একইভাবে সম্পর্কযুক্ত হওয়া দরকার এবং / অথবা রাস্তাঘাটের পরে আমি কি এই সম্পর্কগুলি অপ্রয়োজনীয় উপায়ে পুনঃব্যবহার করব?" আমরা এই প্রশ্নটি জিজ্ঞাসা করার কারণ কারণ বিষয়বস্তুর ধরণের ফ্রেমওয়ার্কটি সর্বোত্তমভাবে কাজ করে: এটি মডেলগুলির মধ্যে জেনেরিক সম্পর্ক তৈরি করে। ভাল, আসুন কিছু কোডের মধ্যে ডুব দিয়ে দেখি আমি কী বোঝাতে চাইছি।

# ourapp.models
from django.conf import settings
from django.db import models

# Assign the User model in case it has been "swapped"
User = settings.AUTH_USER_MODEL

# Create your models here
class Post(models.Model):
  author = models.ForeignKey(User)
  title = models.CharField(max_length=75)
  slug = models.SlugField(unique=True)
  body = models.TextField(blank=True)

class Picture(models.Model):
  author = models.ForeignKey(User)
  image = models.ImageField()
  caption = models.TextField(blank=True)

class Comment(models.Model):
  author = models.ForeignKey(User)
  body = models.TextField(blank=True)
  post = models.ForeignKey(Post)
  picture = models.ForeignKey(Picture)

ঠিক আছে, সুতরাং তাত্ত্বিকভাবে এই সম্পর্ক তৈরি করার জন্য আমাদের কাছে একটি উপায় আছে। যাইহোক, পাইথন প্রোগ্রামার হিসাবে আপনার উচ্চতর বুদ্ধি আপনাকে এই স্তন্যপান জানায় এবং আপনি আরও ভাল করতে পারেন। উচ্চ পাঁচ!

সামগ্রী প্রকার ফ্রেমওয়ার্ক প্রবেশ করান!

ঠিক আছে, এখন আমরা আমাদের মডেলগুলি ঘনিষ্ঠভাবে দেখব এবং তাদের আরও "পুনরায় ব্যবহারযোগ্য" এবং স্বজ্ঞাত হতে পুনরায় কাজ করব। আসুন আমাদের Commentমডেলটির দুটি বিদেশী কী থেকে মুক্তি পেয়ে এটিকে প্রতিস্থাপন করুন GenericForeignKey

# ourapp.models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

...

class Comment(models.Model):
  author = models.ForeignKey(User)
  body = models.TextField(blank=True)
  content_type = models.ForeignKey(ContentType)
  object_id = models.PositiveIntegerField()
  content_object = GenericForeignKey()

তো, কী হল? ঠিক আছে, আমরা গিয়েছিলাম এবং অন্যান্য মডেলের সাথে জেনেরিক সম্পর্কের জন্য প্রয়োজনীয় কোড যুক্ত করেছি। লক্ষ্য করুন কিভাবে সেখানে শুধু একটি বেশী GenericForeignKey, এছাড়াও একটি ForeignKeyথেকে ContentTypeএবং একটি PositiveIntegerFieldজন্য object_id। এই ক্ষেত্রগুলি জাঙ্গোকে বলার জন্য যা এটি কোন ধরণের অবজেক্টের সাথে সম্পর্কিত এবং সেই বস্তুর জন্য আইডি কী। বাস্তবে, এটি বোধগম্য কারণ জ্যাঙ্গোর এই সম্পর্কিত বিষয়গুলি অনুসন্ধান করার জন্য উভয়েরই প্রয়োজন হবে।

ওয়েল, এটি খুব পাইথনের মতো নয় ... এর কন্ডাক্ট কুরুচিপূর্ণ!

আপনি সম্ভবত এয়ার-টাইট, দাগহীন, স্বজ্ঞাত কোডের সন্ধান করছেন যা গাইডো ভ্যান রসুমকে গর্বিত করে তুলবে । আমি তোমাকে পাই আসুন GenericRelationক্ষেত্রটি দেখুন যাতে আমরা এটির উপর একটি সুন্দর ধনুক রাখতে পারি।

# ourapp.models
from django.contrib.contenttypes.fields import GenericRelation

...

class Post(models.Model):
  author = models.ForeignKey(User)
  title = models.CharField(max_length=75)
  slug = models.SlugField(unique=True)
  body = models.TextField(blank=True)
  comments = GenericRelation('Comment')

class Picture(models.Model):
  author = models.ForeignKey(User)
  image = models.ImageField()
  caption = models.TextField(blank=True)
  comments = GenericRelation('Comment')

বাম! ঠিক এর মতো আপনি এই দুটি মডেলের মন্তব্যে কাজ করতে পারেন। প্রকৃতপক্ষে, আসুন এবং আমাদের শেলটিতে এটি করুন ( python manage.py shellআপনার জাজানো প্রকল্প ডিরেক্টরি থেকে টাইপ করুন )।

>>> from django.contrib.auth import get_user_model
>>> from ourapp.models import Picture, Post

# We use get_user_model() since we are referencing directly
User = get_user_model()

# Grab our own User object
>>> me = User.objects.get(username='myusername')

# Grab the first of our own pictures so we can comment on it
>>> pic = Picture.objects.get(author=me)

# Let's start making a comment for our own picture
>>> pic.comments.create(author=me, body="Man, I'm cool!")

# Let's go ahead and retrieve the comments for this picture now
>>> pic.comments.all()
[<Comment: "Man, I'm cool!">]

# Same for Post comments
>>> post = Post.objects.get(author=me)
>>> post.comments.create(author=me, body="So easy to comment now!")
>>> post.comments.all()
[<Comment: "So easy to comment now!"]

এটা খুব সহজ।

এই "জেনেরিক" সম্পর্কের অন্যান্য ব্যবহারিক প্রভাবগুলি কী কী?

জেনেরিক বিদেশী কী বিভিন্ন অ্যাপ্লিকেশনের মধ্যে স্বল্প সম্পর্কের জন্য মঞ্জুরি দেয়। উদাহরণস্বরূপ, ধরা যাক আমরা এর নিজস্ব অ্যাপ্লিকেশনটির মধ্যে মন্তব্য মডেলটি টেনে এনেছি chatterly। এখন আমরা অন্য একটি অ্যাপ্লিকেশন তৈরি করতে চাই noise_nimbusযেখানে লোকেরা অন্যদের সাথে ভাগ করে নেওয়ার জন্য তাদের সংগীত সংরক্ষণ করে।

আমরা কী যদি এই গানে মন্তব্য যুক্ত করতে চাই? ঠিক আছে, আমরা কেবল একটি সাধারণ সম্পর্ক আঁকতে পারি:

# noise_nimbus.models
from django.conf import settings
from django.contrib.contenttypes.fields import GenericRelation
from django.db import models

from chatterly.models import Comment

# For a third time, we take the time to ensure custom Auth isn't overlooked
User = settings.AUTH_USER_MODEL

# Create your models here
class Song(models.Model):
  '''
  A song which can be commented on.
  '''
  file = models.FileField()
  author = models.ForeignKey(User)
  title = models.CharField(max_length=75)
  slug = models.SlugField(unique=True)
  description = models.TextField(blank=True)
  comments = GenericRelation(Comment)

আমি আশা করি আপনি ছেলেরা এটি সহায়ক হিসাবে পেয়েছিলেন কারণ আমি এমন কোনও বিষয় জুড়ে আসতে পছন্দ করতাম যা আমাকে আরও বাস্তবের প্রয়োগ GenericForeignKeyএবং GenericRelationক্ষেত্রগুলি দেখায় ।

এই সত্য হতে পারে খুব ভাল?

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

আমি এখানে প্রদর্শিত চেয়ে কন্টেন্ট টাইপ ফ্রেমওয়ার্ক আরও আছে। গ্রানুলারিটি এবং আরও ভার্বোজের ব্যবহারের একটি সম্পূর্ণ স্তর রয়েছে, তবে গড়পড়তা ব্যক্তির পক্ষে, আপনি আমার মতে 10 বারের মধ্যে 9 বার এটি ব্যবহার করবেন।

জেনেরিক রিলেটিইজার (?) সাবধান!

বরং একটি বৃহত্তর সতর্কতা হ'ল আপনি যখন একটি ব্যবহার করেন GenericRelation, যদি GenericRelationপ্রয়োগ হওয়া মডেলটি ( Picture) মুছে ফেলা হয় তবে সমস্ত সম্পর্কিত ( Comment) অবজেক্টগুলিও মুছে ফেলা হবে। বা কমপক্ষে এই লেখার সময় হিসাবে।


11
তাই আপনি যদি আমি ব্যবহার GenericRelationমধ্যে Postএবং Pictureতারপর আমি ব্যবহার করার প্রয়োজন হবে না object_id, content_typeএবং content_objectComment?
এভিআই

5
অফিসিয়াল জাজানো ডকুমেন্টেশনের কোথাও কনটেন্ট টাইপের কাঠামোর এমন পরিষ্কার বিবরণ পাওয়া ভাল লাগবে। আমার হিসাবে আমি বুঝতে পেরেছি যে এই কাঠামোটি কেবল এই বন্দরটি পড়ার পরে কি করে। ধন্যবাদ.
প্রখর

2
কিছুটা দেরি ... তবে আমি শুনেছি বিষয়বস্তুর ধরণের ফ্রেমওয়ার্ক ব্যবহার করে আপনার অ্যাপ্লিকেশনটি সঠিকভাবে মাপতে পারে না। কেউ দয়া করে আমাকে বলতে পারেন এটি সত্য বা প্রতারণা কিনা?
করণ কুমার

1
করণ হিসাবে প্রোগ্রামিংয়ের সমস্ত কিছুর মতো উত্তর সর্বদা "এটি নির্ভর করে"। আমি বলব বিষয়বস্তুর প্রকারগুলি ব্যবহার করুন। এটি একটি টেবিল ভিত্তিক এসকিউএল সিস্টেমের কিছু অনমনীয় মৌলিক বিষয়গুলি বাইপাস করার ধরণের "আপস"। অকাল থেকে আপনার অ্যাপ্লিকেশন অনুকূলিত করবেন না! জ্যাঙ্গো আপনার পথ থেকে বেরিয়ে আসার ক্ষেত্রে সর্বোত্তম যাতে আপনি সর্বদা চেয়েছিলেন পরবর্তী প্রজন্মের অ্যাপ্লিকেশনটি লিখতে পারেন: এটির বৈশিষ্ট্যগুলি আপনার সুবিধার্থে ব্যবহার করুন!
ক্রিস শেল্টন

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

-2

ঠিক আছে আপনার প্রশ্নের সরাসরি উত্তর: (জাঙ্গো উত্স কোড থেকে) হ'ল: মিডিয়া টাইপগুলি আরএফসি 2616, বিভাগ 3.7 অনুযায়ী পার্সিং করছে।

কোনটি অশ্রু বলার উপায় যে এটি 'সামগ্রী-টাইপ' httpd শিরোনামটি দিয়ে আপনাকে পাঠাতে / মঞ্জুরি দেওয়ার অনুমতি দেয় / পাস করে ।

তবে, আপনি আরও অনুশীলন ব্যবহারের উদাহরণ চাইছেন। আমার কাছে আপনার জন্য 2 টি পরামর্শ রয়েছে:

1: এই কোড পরীক্ষা করুন

def index(request):
   media_type='text/html'
   if request.META.has_key('CONTENT_TYPE'):
      media_type = request.META['CONTENT_TYPE'].split(';')[0]

   if media_type.lower() == 'application/json':
      return HttpResponse("""{ "ResponseCode": "Success"}""", content_type="application/json; charset=UTF-8")

   return HttpResponse("<h1>regular old joe</h1>");

2: মনে রাখবেন জ্যাঙ্গো অজগর এবং এর মতো এটি পাইথন সম্প্রদায়ের শক্তি চালিত করে। জ্যাঙ্গোতে দুর্দান্ত 2 টি RESTFul প্লাগইন রয়েছে। সুতরাং আপনি যদি খরগোশের পুরোটা কত গভীর হয় তা দেখতে চান তবে আপনি পরীক্ষা করে দেখতে পারেন।

আমি জ্যাঙ্গো-রেস্ট-ফ্রেমওয়ার্ক টিউটোরিয়ালটি দিয়ে যাওয়ার পরামর্শ দিচ্ছি যা বিশেষত 'বিভিন্ন সামগ্রী / প্রকারের অভিনয়কে' সম্বোধন করবে। দ্রষ্টব্য: কনটেন্ট-টাইপ শিরোলেখটিকে 'সংস্করণ' বিশ্রামের এপিআই'র ব্যবহার করা সাধারণ অভ্যাস ।


1
তিনি কি সেই বিষয়টি উল্লেখ করছেন? বা বিষয়বস্তুর কাঠামোতে ?: ডকস.ডজ্যাঙ্গোপ্রজেক্ট
এএন

1
হ্যাঁ, আমি সামগ্রীর ধরণের ফ্রেমওয়ার্কটি উল্লেখ করছি। আমি নিজেকে জানাতে খুব ভাল কাজ না করতে পারেন। আমি নির্বিশেষে প্রতিক্রিয়া প্রশংসা করি। এর মূল্য কী, যদি তা আমার প্রশ্ন হয় তবে আপনি এটি পার্কের বাইরে ছুঁড়ে
ক্রিস শেলটন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.