【问题标题】:Django field refering to another fieldDjango 字段引用另一个字段
【发布时间】:2015-01-17 00:39:58
【问题描述】:

我即将制作一个带有条件的 Django 模型。我考虑过这些领域

class Condition(models.Model):
    model_name = CharField(max_length=100)
    field_name = CharField(max_length=100)
    value = CharField(max_length=100)

所以我可以创建一个条件,其中特定模型 (model_name) 中的特定字段 (field_name) 等于 value。但我认为可能已经有解决方案了?而不是使用field_name,我想是否可以通过ContentType 或其他方式直接引用该字段?

【问题讨论】:

标签: python django django-models foreign-keys django-views


【解决方案1】:

我知道这是非常高级的,并且代码并不能完全按照您的要求进行建模。但它们是来自

的简单示例

Django 发出信号以确定何时发生更改。 https://docs.djangoproject.com/en/dev/topics/signals/

这是我的应用程序中的一个 signals.py 文件,用于在用户更改时管理 Person 对象:

from django.db import models
from anotherapp.models import *

def user_post_delete(sender, instance, **kwargs):
    try:
        if instance.username:
            person_item = Person.objects.get(username = instance.username)
            person_item.django_user = None
            person_item.save()
    except:
        pass

def user_post_save(sender, instance, **kwargs):
    try:
        if instance.username:
            p, created = Person.objects.get_or_create(
                username=instance.username)
            p.django_user = instance
            p.save()
    except:
        pass

models.signals.post_delete.connect(user_post_delete, sender=User)
models.signals.post_save.connect(user_post_save, sender=User)

Django ContentTypes 将您的条件与相关对象相关联。 https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/

这是我与 ContentTypes 一起使用的模型:

from django.contrib.contenttypes.models import ContentType
class Comment(models.Model):
    message = models.TextField()
    #removed fields not relevent
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey('content_type', 'object_id')
    date_added = models.DateTimeField('date_added',auto_now_add=True, editable=False)
    date_updated = models.DateTimeField('date_updated',auto_now_add=True, auto_now=True, editable=False)

然后在你的views.py/signals.py中使用那个ContentType模型(Ticket是模型名,t.id是Ticket对象的id:

new_comment = Comment(
    message = "test message",
    content_type = ContentType.objects.get(model='Ticket'),
    object_id = t.id,
)
new_comment.save()

然后,您可能想要扩展一个简单的布尔值来判断您的条件是否满足,或者进一步了解它并使用另一个模型来存储结果并得出“5

【讨论】:

    【解决方案2】:

    可以参考Django的models.ForeignKey文档。

    【讨论】:

    • 外键引用其他对象。我想引用字段。
    猜你喜欢
    • 1970-01-01
    • 2023-01-01
    • 2021-10-05
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2019-09-04
    • 2023-02-24
    相关资源
    最近更新 更多