2014-08-28 3 views
1

В дополнительных полях Django для дополнительных полей мы можем добавить дополнительные поля в качестве кода ниже (от https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany), мой вопрос: как я могу получить дополнительные поле легко, возможно ли напрямую не запрашивать в промежуточной таблице? ТОЧНО пример:получить дополнительное значение поля в отношениях «многие ко многим» Django

>>> ringo = Person.objects.create(name="Ringo Starr") 
>>> paul = Person.objects.create(name="Paul McCartney") 
>>> beatles = Group.objects.create(name="The Beatles") 
>>> m1 = Membership(person=ringo, group=beatles, 
...  date_joined=date(1962, 8, 16), 
...  invite_reason="Needed a new drummer.") 
>>> m1.save() 
>>> beatles.members.all() 
[<Person: Ringo Starr>] 

>>> p = beatles.members.all()[0] 
>>> p 
[<Person: Ringo Starr>] 

Я хочу, чтобы получить date_joined значение р, я знаю, что это может быть сделано

>>> Membership.objects.get(person=p, group=beatles).date_joined 
datetime.date(1962, 8, 16) 

но можно получить его просто так же, как:

>>> p.xxx(*args) 

=============== models.py ================

from django.db import models 

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

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 

    def __str__(self):    # __unicode__ on Python 2 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 
+0

Можете ли вы подробнее остановиться на том, как вы хотите получить доступ к этому? Например, вы ищете контекст в представлении, который вернет дату, когда текущий пользователь присоединился к какой-либо группе, в которой они находятся? Я спрашиваю, потому что ваше использование 'p' в вопросе меня сбивает с толку. Следуя примеру, вы дали ответ, просто будет 'p.date_joined'. –

+1

не точно, нет доступного p.date_joined, так как поле date_joined находится в таблице Membership (для каждого Person оно может иметь несколько записей и несколько значений date_joined, поскольку оно может объединяться с несколькими группами), таблица Person записывает только имя человека. – vts

ответ

1

От documentation page you link to:

Другой способ получить доступ к той же информации, запрашивая многие-ко-многим обратную связь от лица объекта:

>>> ringos_membership = ringo.membership_set.get(group=beatles) 
>>> ringos_membership.date_joined 
datetime.date(1962, 8, 16) 
>>> ringos_membership.invite_reason 
'Needed a new drummer.'