首页 > 解决方案 > 如何在 django 中创建一个具有多个模型之一的外键的模型?

问题描述

我想创建一个可以引用其他三个模型之一的外键。例子:

user
  fav_animal: foreign_key(bear, cat, dog)

bear
  name

cat
 name

dog
  name

我怎样才能在 django 中实现这一点?我是否只创建 3 个可为空的外键?那么我如何强制始终设置其中之一呢?

标签: djangodjango-rest-framework

解决方案


您可能想要使用通用外键,如下所述:https ://docs.djangoproject.com/en/2.2/ref/contrib/contenttypes/#generic-relations 。

对于您的示例,代码可能如下所示:

# models.py
class User(models.Model):
    name = models.CharField(max_length=100)
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE, null=True)
    animal_id = models.PositiveIntegerField(null=True)
    animal = GenericForeignKey('content_type', 'animal_id')


class Bear(models.Model):
    name = models.CharField(max_length=100)


class Cat(models.Model):
    name = models.CharField(max_length=100)


class Dog(models.Model):
    name = models.CharField(max_length=100)


# And the usage:

In [1]: b1=Bear.objects.create(name='b1')

In [2]: u1=User.objects.create(name='u1', animal=b1)

In [3]: u1.animal
Out[3]: <Bear: Bear object (1)>

In [4]: u1.animal_id
Out[4]: 1

推荐阅读