জাজানো মডেলটির জন্য একটি অনেক থেকে অনেক ক্ষেত্রে কীভাবে একটি অবজেক্ট তৈরি করবেন?


138

আমার মডেল:

class Sample(models.Model):
    users = models.ManyToManyField(User)

আমি উভয় সংরক্ষণ করতে চান user1এবং user2যে মডেল:

user1 = User.objects.get(pk=1)
user2 = User.objects.get(pk=2)
sample_object = Sample(users=user1, users=user2)
sample_object.save()

আমি জানি এটি ভুল, তবে আমি নিশ্চিত যে আমি যা করতে চাই তা আপনি পেয়ে গেছেন। তুমি এটা কি ভাবে করবে ?

উত্তর:


241

আপনি সংরক্ষিত অবজেক্ট থেকে এম 2 মিটার সম্পর্ক তৈরি করতে পারবেন না। যদি আপনার কাছে থাকে তবে pkএটি ব্যবহার করে দেখুন:

sample_object = Sample()
sample_object.save()
sample_object.users.add(1,2)

আপডেট: স্যাভারিওর উত্তর পড়ার পরে , আমি বিষয়টি আরও গভীরতার সাথে তদন্ত করার সিদ্ধান্ত নিয়েছি। এখানে আমার অনুসন্ধান আছে।

এটি আমার মূল পরামর্শ ছিল। এটি কাজ করে, তবে অনুকূল নয়। (দ্রষ্টব্য: আমি ব্যবহার করছি Bars এবং একটি Fooপরিবর্তে Users এবং একটি Sample, কিন্তু আপনি ধারণা পেতে)।

bar1 = Bar.objects.get(pk=1)
bar2 = Bar.objects.get(pk=2)
foo = Foo()
foo.save()
foo.bars.add(bar1)
foo.bars.add(bar2)

এটি মোট 7 টি প্রশ্নের উত্পন্ন করে:

SELECT "app_bar"."id", "app_bar"."name" FROM "app_bar" WHERE "app_bar"."id" = 1
SELECT "app_bar"."id", "app_bar"."name" FROM "app_bar" WHERE "app_bar"."id" = 2
INSERT INTO "app_foo" ("name") VALUES ()
SELECT "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE ("app_foo_bars"."foo_id" = 1  AND "app_foo_bars"."bar_id" IN (1))
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 1)
SELECT "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE ("app_foo_bars"."foo_id" = 1  AND "app_foo_bars"."bar_id" IN (2))
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 2)

আমি নিশ্চিত যে আমরা আরও ভাল করতে পারি। আপনি add()পদ্ধতিতে একাধিক বস্তু পাস করতে পারেন :

bar1 = Bar.objects.get(pk=1)
bar2 = Bar.objects.get(pk=2)
foo = Foo()
foo.save()
foo.bars.add(bar1, bar2)

আমরা দেখতে পাচ্ছি, একাধিক বস্তু পাস করা একটি সংরক্ষণ করে SELECT:

SELECT "app_bar"."id", "app_bar"."name" FROM "app_bar" WHERE "app_bar"."id" = 1
SELECT "app_bar"."id", "app_bar"."name" FROM "app_bar" WHERE "app_bar"."id" = 2
INSERT INTO "app_foo" ("name") VALUES ()
SELECT "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE ("app_foo_bars"."foo_id" = 1  AND "app_foo_bars"."bar_id" IN (1, 2))
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 1)
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 2)

আপনি অবজেক্টের একটি তালিকাও অর্পণ করতে পারেন তা আমি অবগত ছিলাম না:

bar1 = Bar.objects.get(pk=1)
bar2 = Bar.objects.get(pk=2)
foo = Foo()
foo.save()
foo.bars = [bar1, bar2]

দুর্ভাগ্যক্রমে, এটি একটি অতিরিক্ত তৈরি করে SELECT:

SELECT "app_bar"."id", "app_bar"."name" FROM "app_bar" WHERE "app_bar"."id" = 1
SELECT "app_bar"."id", "app_bar"."name" FROM "app_bar" WHERE "app_bar"."id" = 2
INSERT INTO "app_foo" ("name") VALUES ()
SELECT "app_foo_bars"."id", "app_foo_bars"."foo_id", "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE "app_foo_bars"."foo_id" = 1
SELECT "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE ("app_foo_bars"."foo_id" = 1  AND "app_foo_bars"."bar_id" IN (1, 2))
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 1)
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 2)

আসুন pkসেভেরিওর পরামর্শ অনুসারে এর একটি তালিকা নির্ধারণের চেষ্টা করি :

foo = Foo()
foo.save()
foo.bars = [1,2]

যেহেতু আমরা দু'টি আনব না Bar, আমরা দুটি SELECTবিবৃতি সংরক্ষণ করি , যার ফলস্বরূপ মোট 5:

INSERT INTO "app_foo" ("name") VALUES ()
SELECT "app_foo_bars"."id", "app_foo_bars"."foo_id", "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE "app_foo_bars"."foo_id" = 1
SELECT "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE ("app_foo_bars"."foo_id" = 1  AND "app_foo_bars"."bar_id" IN (1, 2))
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 1)
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 2)

এবং বিজয়ী:

foo = Foo()
foo.save()
foo.bars.add(1,2)

pkএস পাস করা add()আমাদের মোট 4 টি কোয়েরি দেয়:

INSERT INTO "app_foo" ("name") VALUES ()
SELECT "app_foo_bars"."bar_id" FROM "app_foo_bars" WHERE ("app_foo_bars"."foo_id" = 1  AND "app_foo_bars"."bar_id" IN (1, 2))
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 1)
INSERT INTO "app_foo_bars" ("foo_id", "bar_id") VALUES (1, 2)

25
আমি যুক্ত করতে চাই, আপনি * এর মত একটি তালিকা পাস করতে পারেন: foo.bars.add (* তালিকা) এবং এটি তালিকাটিকে যুক্তিগুলিতে বিস্ফোরিত করবে: ডি
গিলেরমো সিলিসিও ট্রুবা

1
এটি ম্যান্টিটোম্যানির জ্যাঙ্গো ডক্স হওয়া উচিত! তারপরে ডেস্ক.ডজ্যাঙ্গোপ্রজেক্ট / স্পেন / ডটকম / ডাবিক্স / ডিবি / উদাহরণসমূহ / মানি_টো_মানি বা ডকস.ডজ্যাঙ্গোপ্রজেক্ট / এএন / ১১.১০ / আরএফ / মডেলস / ফিল্ডস এবং আরও বিভিন্ন পদ্ধতির জন্য পারফরম্যান্স জরিমানার সাথে আরও পরিষ্কার । সম্ভবত আপনি এটি জ্যাঙ্গো 1.9 এর জন্য আপডেট করতে পারেন? (সেট পদ্ধতি)
gabn88

আমি একক আইডি দিয়ে আরও একটি আইটেম এবং পরিমাণ সহ মডেল সংরক্ষণ করতে চাই। এটা কি সম্ভব হবে ?? ক্লাস কার্ট (মডেলস.মোডেল): আইটেম = মডেলস ore ফোরইনকি (আইটেম, ক্রিয়াপদ_নাম = "আইটেম") পরিমাণ = মডেল osপসটিভ ইন্টিজারফিল্ড (ডিফল্ট = 1)
নীতেশ

কি দারুন. এখনও বিক্রয়ের জন্য. : ডি
Б.Б.

111

ভবিষ্যতের দর্শনার্থীদের জন্য, আপনি নতুন ব্যবহার করে একটি বস্তু এবং এর সমস্ত মি 2 মি অবজেক্ট তৈরি করতে পারেন eries জাজানো ১.৪- তে বাল্ক_ক্রিয়েট মি মি। মনে রাখবেন যে কেবলমাত্রসংরক্ষণ () পদ্ধতি বা সংকেত সহ ডেটাতে কোনও প্রাক বা পোস্ট প্রসেসিংয়েরপ্রয়োজন না হলে এটি কেবল ব্যবহারযোগ্য। আপনি যা sertোকান তা হ'ল ডিবিতে কী হবে

আপনি মাঠে একটি "মাধ্যমে" মডেল নির্দিষ্ট না করে এটি করতে পারেন। সম্পূর্ণতার জন্য, নীচের উদাহরণটি মূল পোস্টারটি যা জিজ্ঞাসা করছে তা নকল করতে একটি ফাঁকা ব্যবহারকারী মডেল তৈরি করে।

from django.db import models

class Users(models.Model):
    pass

class Sample(models.Model):
    users = models.ManyToManyField(Users)

এখন, শেল বা অন্যান্য কোডে ২ জন ব্যবহারকারী তৈরি করুন, একটি নমুনা অবজেক্ট তৈরি করুন এবং প্রচুর পরিমাণে সেই নমুনা অবজেক্টে ব্যবহারকারীদের যুক্ত করুন।

Users().save()
Users().save()

# Access the through model directly
ThroughModel = Sample.users.through

users = Users.objects.filter(pk__in=[1,2])

sample_object = Sample()
sample_object.save()

ThroughModel.objects.bulk_create([
    ThroughModel(users_id=users[0].pk, sample_id=sample_object.pk),
    ThroughModel(users_id=users[1].pk, sample_id=sample_object.pk)
])

আমি আপনার উত্তরটি এখানে ব্যবহার করার চেষ্টা করছি তবে আমি আটকে যাচ্ছি। থটস?
পিওরফেরেট

স্পষ্টরূপে সংজ্ঞায়িত ইন্টারমিডিয়েট (মাধ্যমে) শ্রেণি ব্যতীত কেউ এটি করতে পারে তা নিশ্চিতভাবেই তথ্যমূলক, তবে, ইন্টারমিডিয়েট ক্লাস ব্যবহারের কোড পাঠযোগ্যতার জন্য সুপারিশ করা হয়। এখানে দেখুন ।
colm.anseo

দুর্দান্ত সমাধান!
পাইমারকো

19

জ্যাঙ্গো ১.৯
একটি দ্রুত উদাহরণ:

sample_object = Sample()
sample_object.save()

list_of_users = DestinationRate.objects.all()
sample_object.users.set(list_of_users)

8

সম্পর্কিতঅবজেক্টম্যানেজারগুলি কোনও মডেলের ক্ষেত্রগুলির চেয়ে পৃথক "বৈশিষ্ট্য"। আপনি যা সন্ধান করছেন তা অর্জন করার সহজ উপায়

sample_object = Sample.objects.create()
sample_object.users = [1, 2]

অতিরিক্ত অনুসন্ধান এবং মডেল বিল্ডিং ছাড়াই এটি একটি ব্যবহারকারী তালিকা নির্ধারণের সমান।

যদি প্রশ্নের সংখ্যাটি আপনাকে বিরক্ত করে (সরলতার পরিবর্তে), তবে সর্বোত্তম সমাধানটির জন্য তিনটি প্রশ্নের প্রয়োজন:

sample_object = Sample.objects.create()
sample_id = sample_object.id
sample_object.users.through.objects.create(user_id=1, sample_id=sample_id)
sample_object.users.through.objects.create(user_id=2, sample_id=sample_id)

এটি কাজ করবে কারণ আমরা ইতিমধ্যে জানি যে 'ব্যবহারকারীর তালিকাটি খালি, তাই আমরা নির্বোধ তৈরি করতে পারি।


2

আপনি সম্পর্কিত অবজেক্টের সেটটি এইভাবে প্রতিস্থাপন করতে পারেন (জাজানো 1.9 তে নতুন):

new_list = [user1, user2, user3]
sample_object.related_set.set(new_list)

0

কেউ যদি ডেভিড মার্বেলসকে ম্যানিটোম্যানির ক্ষেত্রে উল্লেখ করে একটি স্বতঃপ্রকাশের বিষয়ে উত্তর খুঁজছেন। মাধ্যমে মডেলগুলির আইডিগুলি বলা হয়: "to_'model_name_id" এবং "from_'model_name'_id"।

যদি এটি কাজ না করে তবে আপনি জাঙ্গো সংযোগটি পরীক্ষা করতে পারেন।

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