Django:我想连接一对多关系

0 投票
2 回答
619 浏览
提问于 2025-04-17 15:06

Django:我想了解一下如何处理一对多的关系...

这里输入图片描述

我该怎么做呢?

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...

Note模型:一个模型可以对应多个...

Note模型:B模型也可以对应多个...

我想同时连接Note - A和Note - B...

请帮我解答一下!

谢谢!

编辑 130208 8:36 KST----

也许可以用ForeignKey来实现...

但在我的情况下不能这样用。

因为如果我只想建立一个连接(比如Note到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)

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

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

2 个回答

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...
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)。这个属性包含了的实例,你可以通过它访问相关的属性。

想了解更多信息,可以查看 文档的这一部分

撰写回答