确定属于django多对多链接的字段

发布于 2025-01-04 22:06:16 字数 1607 浏览 2 评论 0原文

我有 4 个假设模型:

class Basea(models.Model):
    name = models.CharField("Name", max_length=30)
    type = models.ManyToManyField('Type', blank=True, related_name='types', db_table=u'test_basea_type')

class Baseb(models.Model):
    name = models.CharField("Name", max_length=30)
    type = models.ManyToManyField('Type', blank=True, related_name='types', db_table=u'test_baseb_type')

class Basec(models.Model):
    name = models.CharField("Name", max_length=30)
    type = models.ManyToManyField('Type', blank=True, related_name='types', db_table=u'test_basec_type')

class Type(models.Model):
    name = models.CharField("Name", max_length=30, unique=True)
    baseas = ManyToManyField_NoSyncdb(Basea, blank=True, related_name='type_baseas',  db_table=u'test_basea_type')
    basebs = ManyToManyField_NoSyncdb(Baseb, blank=True, related_name='type_basebs',  db_table=u'test_baseb_type')
    basecs = ManyToManyField_NoSyncdb(Basec, blank=True, related_name='type_basecs',  db_table=u'test_basec_type')

我正在创建一个新类型,并且我想在保存新类型对象后附加一个多对多链接。在我看来,这工作得很好:

if form.is_valid(): # All validation rules pass
    new_obj = form.save(commit=False)
    # Do some stuff 
    new_obj.save()
    new_obj.baseas.add(link_object.id) #link_object pulled earlier in the code

所以我将有一个 link_object,它可以是 Basea、Baseb 或 Basec。我可以使用什么代码来更改最后一行:

    new_obj.baseas.add(link_object.id) 

以便该字段对应于正确的对象类型?因此,如果 link_object 来自 Baseb,则代码应该执行以下功能:

    new_obj.basebs.add(link_object.id) 

如何更通用地定义该字段名称?

I have 4 hypothetical models:

class Basea(models.Model):
    name = models.CharField("Name", max_length=30)
    type = models.ManyToManyField('Type', blank=True, related_name='types', db_table=u'test_basea_type')

class Baseb(models.Model):
    name = models.CharField("Name", max_length=30)
    type = models.ManyToManyField('Type', blank=True, related_name='types', db_table=u'test_baseb_type')

class Basec(models.Model):
    name = models.CharField("Name", max_length=30)
    type = models.ManyToManyField('Type', blank=True, related_name='types', db_table=u'test_basec_type')

class Type(models.Model):
    name = models.CharField("Name", max_length=30, unique=True)
    baseas = ManyToManyField_NoSyncdb(Basea, blank=True, related_name='type_baseas',  db_table=u'test_basea_type')
    basebs = ManyToManyField_NoSyncdb(Baseb, blank=True, related_name='type_basebs',  db_table=u'test_baseb_type')
    basecs = ManyToManyField_NoSyncdb(Basec, blank=True, related_name='type_basecs',  db_table=u'test_basec_type')

I'm creating a new Type, and I want to attach a many-to-many link after the new Type object is saved. In my view, this works just fine:

if form.is_valid(): # All validation rules pass
    new_obj = form.save(commit=False)
    # Do some stuff 
    new_obj.save()
    new_obj.baseas.add(link_object.id) #link_object pulled earlier in the code

So I'll have a link_object that's either Basea, Baseb, or Basec. What code could I use to change the last line:

    new_obj.baseas.add(link_object.id) 

such that the field corresponds to the correct object type? So if link_object was from Baseb, the code should perform the function:

    new_obj.basebs.add(link_object.id) 

How can that field name be defined more generically?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

初相遇 2025-01-11 22:06:16

我认为您正在寻找 GenericForeignKey< /a>.

I think you are looking for GenericForeignKey.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文