django - 如何在 django 中创建一个具有多个模型之一的外键的模型?
问题描述
我想创建一个可以引用其他三个模型之一的外键。例子:
user
fav_animal: foreign_key(bear, cat, dog)
bear
name
cat
name
dog
name
我怎样才能在 django 中实现这一点?我是否只创建 3 个可为空的外键?那么我如何强制始终设置其中之一呢?
解决方案
您可能想要使用通用外键,如下所述: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
推荐阅读
- ubuntu - 如果 RabbitMQ 停止,则保留该进程.. 正常吗?
- pdf - iOS11如何在PDFKit中添加图片注释
- ruby - 'JSON.parse' 错误处理无效/非 JSON 格式
- django - Django 在测试时更改缓存设置
- php - 在 Laravel 中验证 ajax 上传的文件
- firebase - 从过滤器更新 Firebase 查询
- c# - C#如何调用http post方法并取回结果
- python - 使用多处理编写 JSON 文件 - Python
- javascript - AngularJS 中的原型继承如何工作?
- c# - 使用 linq 查询接收修改后的列表
>