Django:我想连接一对多

时间:2013-02-07 15:01:25

标签: python django django-models django-1.4

Django:我想连接一对多......

enter image description here

我该怎么办?

from django.db import models

class Note(models.Model)
    content = models.CharField(max_length=20)

class A(models.Model)
    name = models.CharField(max_length=20)
    addr = models.CharField(max_length=20)
    notes = models.ManyToManyField(Note) # ...? I don't know...

class B(models.Model)
    nickname = models.CharField(max_length=20)
    mobile = models.CharField(max_length=20)
    notes = models.ManyToManyField(Note) # ...? I don't know...

注意型号:型号= 1:N ...... 注意型号:B型号= 1:N ......

我想连接Note-A同时注意 - B ......

请回答我!

谢谢!

编辑130208 8:36 KST ----

也许ForegienKey可用......

但我的情况不能用。

因为如果我只想连接(例如A的注释),我可以像下面的代码一样。

from django.db import models

class Note(models.Model)
    content = models.CharField(max_length=20)
    conn = models.ForeignKey(A)

class A(models.Model)
    name = models.CharField(max_length=20)
    addr = models.CharField(max_length=20)

但是我的情况需要两个连接(注意 - A,注意 - B)。

所以......我不知道该怎么做......

2 个答案:

答案 0 :(得分:0)

使用models.ForeignKey

如果您想为A和B的每个实例添加几个音符,您可以尝试这样的事情:

from django.db import models

    class Note(models.Model):
        content = models.CharField(max_length=20)
        related_to = models.ForeignKey(A_or_B)

    class A_or_B(models.Model):
        pass

    class A(A_or_B):
        name = models.CharField(max_length=20)
        addr = models.CharField(max_length=20)

    class B(A_or_B):
        nickname = models.CharField(max_length=20)
        mobile = models.CharField(max_length=20)

搜索属于特定A或B的注释将是这样的:

a = A(name="some_name", addr="somewhere")
a.save()
a_note = Note(content="blablabla", related_to=a.id)
a_note.save()
notes_related_to_a = Note.objects.filter(related_to=a.id)
links_from_notes_to_a = {note_x.related_to.a for note_x in notes_related_to_a}
if len(links_from_notes_to_a) and links_from_notes_to_a[0] == a:
    print "It works!"

抽象父类的related_to属性将具有一个属性,其名称是实际实例类的非大写的名称(在此示例中为a或b)。此属性包含AB的实例,您可以从中访问正确的属性。

查看文档的this part以获取更多信息。

答案 1 :(得分:0)

使用ForeignKey

from django.db import models

class Note(models.Model)
    content = models.CharField(max_length=20)

class A(models.Model)
    name = models.CharField(max_length=20)
    addr = models.CharField(max_length=20)
    notes = models.ForeignKey(Note) # ...? I don't know...

class B(models.Model)
    nickname = models.CharField(max_length=20)
    mobile = models.CharField(max_length=20)
    notes = models.ForeignKey(Note) # ...? I don't know...