كيفية إنشاء الثلاثي الانضمام إلى طاولة المفاوضات مع جانغو

StackOverflow https://stackoverflow.com/questions/72945

سؤال

باستخدام جانغو بنيت في النماذج ، كيف يمكن للمرء أن إنشاء الثلاثي الانضمام بين ثلاثة نماذج.

على سبيل المثال:

  • المستخدمين والأدوار والأحداث النماذج.
  • المستخدمين لديها العديد من الأدوار ، و أدوار العديد من المستخدمين.(ManyToMany)
  • الأحداث العديد من المستخدمين والمستخدمين للعديد من المناسبات.(ManyToMany)
  • ولكن على أي حال ، أي مستخدم قد بدور واحد فقط.

كيف يمكن أن تكون ممثلة في النموذج ؟

هل كانت مفيدة؟

المحلول

zacherates يكتب:

كنت نموذج دور جمعية الصف بين المستخدمين والأدوار (...)

أود أيضا reccomed هذا الحل ، ولكن يمكنك أيضا الاستفادة من بعض النحوية السكر التي تقدمها جانغو: ManyToMany العلاقة مع حقول إضافية.

على سبيل المثال:

class User(models.Model):
    name = models.CharField(max_length=128)

class Event(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(User, through='Role')

    def __unicode__(self):
        return self.name

class Role(models.Model):
    person = models.ForeignKey(User)
    group = models.ForeignKey(Event)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)

نصائح أخرى

أود أن أوصى فقط خلق مستقل تماما من نموذج لهذا.

class Assignment(Model):
    user = ForeignKey(User)
    role = ForeignKey(Role)
    event = ForeignKey(Event)

هذا يتيح لك القيام بكل المعتاد نموذج الاشياء مثل

user.assignment_set.filter(role__name="Chaperon")
role.assignment_set.filter(event__name="Silly Walkathon")

الشيء الوحيد الذي غادر هو فرض واحد دور في المستعمل في الحدث قيود.يمكنك القيام بذلك في مهمة من الدرجة إما تجاوز الأسلوب حفظ (http://docs.djangoproject.com/en/dev/topics/db/models/#overriding-predefined-model-methods) أو باستخدام إشارات (http://docs.djangoproject.com/en/dev/topics/signals/)

كنت نموذج دور جمعية الصف بين المستخدمين والأدوار ، وهكذا ،

class User(models.Model):
     ...

class Event(models.Model):
     ...

class Role(models.Model):
     user = models.ForeignKey(User)
     event = models.ForeignKey(Event)

وإنفاذ دور واحد لكل مستخدم في الحدث إما مدير أو SQL القيود.

بينما كان يحاول العثور على أسرع ثلاث الجدول الانضمام إلى بلدي جانغو نماذج, جئت عبر هذا السؤال.بشكل افتراضي, جانغو 1.1 يستخدم الداخلية ينضم التي يمكن أن تكون بطيئة في ك InnoDB.استعلام مثل:

def event_users(event_name):
    return User.objects.filter(roles__events__name=event_name)

هذا قد خلق SQL التالية:

SELECT `user`.`id`, `user`.`name` FROM `user` INNER JOIN `roles` ON (`user`.`id` = `roles`.`user_id`) INNER JOIN `event` ON (`roles`.`event_id` = `event`.`id`) WHERE `event`.`name` = "event_name"

الداخلية ينضم يمكن أن تكون بطيئة جدا مقارنة مع اليسار ينضم.حتى أسرع الاستعلام يمكن العثور عليها تحت gimg1 الجواب: الاستعلام الخلية للانضمام إلى ثلاثة جداول

SELECT `user`.`id`, `user`.`name` FROM `user`, `roles`, `event` WHERE `user`.`id` = `roles`.`user_id` AND `roles`.`event_id` = `event`.`id` AND `event`.`name` = "event_name"

ومع ذلك ، سوف تحتاج إلى استخدام استعلام SQL مخصص: https://docs.djangoproject.com/en/dev/topics/db/sql/

في هذه الحالة سوف ننظر بشيء من مثل:

from django.db import connection
def event_users(event_name):
    cursor = connection.cursor()
    cursor.execute('select U.name from user U, roles R, event E' \
                   ' where U.id=R.user_id and R.event_id=E.id and E.name="%s"' % event_name)
    return [row[0] for row in cursor.fetchall()]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top