通用关系多对一或多对多?

时间:2018-04-23 11:57:27

标签: django database-design django-models relational-database

我遇到以下问题:

我想创建一个可以与不同模型(Generic Relationship Django)相关联的后果模型(Aka:Pros and Conts模型)并包含以下信息:

Consequences : Boolean (Positive or Negative)
Of : Model_Primary_Key
Reason : Text
Author : User_Primary_Key
Users_likes : List<Users>

一个对象( Of属性)可能会产生很多后果,但结果只会属于一个后果,所以它应该是多对一的关系。

Entity relational diagram

问题在于我不知道后果模型与其他模型之间的关系是多对一还是多对多。

通常当你有一对多时,有多个的部分包含另一个的外键,但是如果我这样做,外键将是作者 Of 并且该集合将是复合主键,但是如果我在这里执行此操作,则每个对象的用户不能有多个结果,并且它应该是可能的。

所以我找到的唯一解决方案是将id作为主键添加到结果中,所以最后它的工作方式就像多对多的关系,因为最终它的工作方式就像Associative entity

所以在我的实体关系图的最后,我应该如何表示这种关系?作为一对多或多对多?

1 个答案:

答案 0 :(得分:0)

您可以使用djangos隐式AutoField作为主键, NOT 添加unique_together约束来克服您描述的障碍。

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

class Consequence(models.Model):
    # implicit AutoField
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    author = models.ForeignKey(User)
    is_positive_consequence = models.BooleanField()
    reason = models.CharField(max_length=200)

class ConsequenceLike(models.Model):
    # implicit AutoField
    parent = models.ForeignKey(Consequence)
    user = models.ForeignKey(User)

这样一个User可以创建指向同一个对象的许多Consequence个实例,因为没有唯一约束。

这为您提供了以后过滤的灵活性:

# created by this user
user_instance.consequence_set.all()

# created by this user, filtered by content type
from myapp.models import MyCarModel
user_instance.consequence_set.filter(
    content_type=ContentType.objects.get_for_model(MyCarModel))

# created by this user, filtered by object instance
my_car = MyCarModel.objects.first()
user_instance.consequence_set.filter(
    content_type=ContentType.objects.get_for_model(my_car.model),
    object_id=my_car.pk)