SORU
9 AĞUSTOS 2011, Salı


Ne kadar çok alanı ile Django bir model için bir nesne oluşturmak için?

Benim model ->

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

Bu kullanıcılar, Kullanıcı1 ve kullanıcı2 bu modelde Kaydet) - ^ yapmak istiyorum .

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

Bunun yanlış olduğunu biliyorum : D ama yapmak istediğim şey...bunu nasıl yapardın ? olsun eminim

CEVAP
9 AĞUSTOS 2011, Salı


Olamaz kaydedilmemiş nesneleri m2m ilişkileri oluşturun. Eğer mm varsa, bu deneyin:

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

Güncelleme:Okuduktan sonra saverio's answer, sorunu biraz daha derinlemesine araştırmaya karar verdim. İşte benim bulgular.

Bu orijinal önerimdi. Çalışır, ama optimal değildir. (Not: Bars User s **19, ama fikir olsun) yerine Foo kullanıyorum.

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 sorguları okkalı bir toplam oluşturur:

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)

Daha iyisini yapabileceğimize eminim. add() yöntemi için birden fazla nesne geçirebilirsiniz:

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

Gördüğünüz gibi, birden çok nesne geçen 24* *bir kaydeder:

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)

Ayrıca nesnelerin listesini atayabilirsiniz farkında değildim:

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

Ne yazık ki, bu SELECT bir ek oluşturur:

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)

Hadi listesi atamak için deneyin `pk saverio önerdiği gibi,:

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

İki Bars getirmek istemeyiz olarak, SELECT iki ifade, toplam 5 sonuçta biz Kaydet:

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)

Ve kazanan:

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

pks eklemek için geçen() bize 4 sorguları toplam verir:

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)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 8bitdigitaltv

    8bitdigitalt

    31 AĞUSTOS 2011
  • dhcrr's channel

    dhcrr's chan

    2 Ocak 2007
  • Jaclyn W

    Jaclyn W

    5 Mayıs 2006