python - 数据模型依赖,我可以简化这些对象吗?

标签 python django

基本上我有 6 个对象模型,3 个用于我的常规对象,3 个用于这些对象的依赖项。单独地,这些对象可以依赖于 3 个常规对象中每一个的一个或多个实例。

我的问题: 这是最佳做法吗?我基本上希望能够在需要时向常规对象添加新的依赖项。例如:

a = A.objects.get(id=1)
adependency = ADependencies.objects.get(dependentTo=a)

然后,我将拥有一个对象,其中包含 a 的所有依赖项。


或者,我确实想到了将3个依赖对象合并为一个的方法;但是,我不确定这是否是一种好的做法。

class Dependencies(models.Model):
    id = models.CharField(max_length=16)
    dependentTo = CharField(max_length=16)
    a = models.ManyToManyField(A)
    b = models.ManyToManyField(B)
    c = models.ManyToManyField(C)

在这种情况下,我不使用 ForeignKey 来映射 dependentTo 对象。相反,我会使用对象 ID 来拉取对象——让我成为类不可知论者;但是,这需要 3 个常规对象的唯一 ID。

a = A.objects.get(id=1)
adependency = ADependencies.objects.get(dependentTo=a.id)

还有一个想法! 是否可能仍然使用 ForeignKey,但传入一个带有类名的字符串?

class Dependencies(models.Model):
    id = models.CharField(max_length=16)
    type = models.CharField(max_length=16)
    dependentTo = ForeignKey(type)
    a = models.ManyToManyField(A)
    b = models.ManyToManyField(B)
    c = models.ManyToManyField(C)

对象模型:

class A(models.Model):
    id = models.CharField(max_length=16)
    title = models.CharField(max_length=32)
    summary = models.CharField(max_length=256)

class B(models.Model):
    id = models.CharField(max_length=16)
    title = models.CharField(max_length=32)
    summary = models.CharField(max_length=256)
    a = models.ForeignKey(A)

class C(models.Model):
    id = models.CharField(max_length=16)
    title = models.CharField(max_length=32)
    summary = models.CharField(max_length=256)
    b = models.ForeignKey(B)

class ADependencies(models.Model):
    id = models.CharField(max_length=16)
    dependentTo = models.ForeignKey(A)
    a = models.ManyToManyField(A)
    b = models.ManyToManyField(B)
    c = models.ManyToManyField(C)

class BDependencies(models.Model):
    id = models.CharField(max_length=16)
    dependentTo = models.ForeignKey(B)
    a = models.ManyToManyField(A)
    b = models.ManyToManyField(B)
    c = models.ManyToManyField(C)

class CDependencies(models.Model):
    id = models.CharField(max_length=16)
    dependentTo = models.ForeignKey(B)
    a = models.ManyToManyField(A)
    b = models.ManyToManyField(B)
    c = models.ManyToManyField(C)

谢谢!

最佳答案

这可以做得更简单。定义一个 Dependency 模型而不是一个 Dependencies 模型。您将需要 contenttypes django 贡献:

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

class Dependency(models.Model):
    dependent_contenttype = models.ForeignKey(ContentType)
    dependent_id = models.PositiveIntegerField()
    dependent = GenericForeignKey('dependent_contenttype', 'dependent_id')

    prerequisite_contenttype = models.ForeignKey(ContentType)
    prerequisite_id = models.PositiveIntegerField()
    prerequisite = GenericForeignKey('prerequisite_contenttype', 
                                     'prerequisite_id')

然后,如果您愿意,可以在模型 ABC 上使依赖关系成为反向泛型关系:

class A:
    # ...
    dependencies = GenericRelation(
        Dependency,
        content_type_field='dependent_contenttype',
        object_id_field='dependent_id')

关于python - 数据模型依赖,我可以简化这些对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29859128/

相关文章:

python - 部署 Django 项目时 Vercel CLI Python 版本问题

python - PyParsing 解析器交替

Python Twisted JSON RPC

C++ Qt - QTcpSocket 发出 readyRead() 但 canReadLine() 始终为 false

Python:写入文件失败且没有错误 - 导致空文件

django - 使用不同的序列化程序进行请求和回复

python - 如何覆盖 models.py 中的 __str__ ?

python - 如何: Macports select python

python - 使用 nginx 和 Gunicorn 运行 django 应用程序时缺少 sock 文件

jquery - Django 在 JQuery AJAX 请求上说 is_ajax 为 false