查询使用Django ORM多对多字段

时间:2013-06-13 17:08:04

标签: python sql django orm

我正在尝试使用Django ORM查询我的bd,但我需要一些帮助。

型号:

class Participant(models.Model):
    username = models.CharField(max_length=20)
    username.primary_key = True
    #password = models.CharField(max_length=128)
    work_place = models.CharField(max_length=50)
    photo = models.FileField(upload_to='user_photo')
    name = models.CharField(max_length=30)
    country = models.CharField(max_length=20)
    phone_number = models.IntegerField(max_length=9)
    email = models.EmailField(unique = True)
    qrcode = models.FileField(upload_to = 'qrcodes',null=True,blank=True)
    contact = models.OneToOneField('Contact', related_name= 'participant_contact')
    user = models.OneToOneField(User)  
    contacts = models.ManyToManyField('Contact', related_name='contact_list', null=True, blank=True)


    def save( self, *args, **kw ):
        self.username = self.user.username
        c= Contact()
        c.save()
        self.contact = c
        super( Participant, self ).save( *args, **kw )

    def __unicode__(self):
        return self.username

class Contact(models.Model):
    id = models.AutoField(primary_key=True)

我需要获得作为特定参与者的联系人的所有参与者

示例:

Contact Table: |  id   |
               |_______|    
               | 1     |  
               | 2     | 

Participant Table: |username|...|participant_contact|
                   |_______ |___|___________________|                  
                   | test   |   |       1           |
                   | test2  |   |       2           |

Contacts Relation: |id_Participant1|id_participant_2|
                   |_______________|________________|                  
                   | 1             | 2              |


> p1 = Participant.objects.get(username="test")
> p2 = Participant.objects.get(username="test2")

因此p2位于p1联系人列表中。如何使用django ORM进行此查询?

1 个答案:

答案 0 :(得分:2)

正确的解决方案是:

> Participant.objects.filter(contact__in= p1.contacts.all())