【问题标题】:How do I keep reference in Django, when editing existing object?编辑现有对象时,如何在 Django 中保持引用?
【发布时间】:2021-09-04 17:00:44
【问题描述】:

所以我的模型中有一个字段引用了另一个模型。如下所示。 (简化)

class Contents(models.Model):
    objects = models.Manager()
    body = models.CharField(max_length=10000, blank=True)
    image = models.ImageField(null=True, blank=True, upload_to='imgs')
    created_at = models.DateField(auto_now_add=True)
    updated_at = models.DateField(auto_now_add=False)

class SavedContents(models.Model):
    objects = models.Manager()
    ref_content = models.ForeignKey(Contents, on_delete=models.CASCADE, related_name='refcontent', null=True)

问题是,在对现有 Content 对象进行更改时,Saved Contents 引用 Contents 的外键关系被破坏。以下是我的观点.py

def update_content(request, content_id):
    content_to_update = Contents.objects.get(id = content_id)

    content_form = ContentsForm(request.POST, request.FILES)
    if request.method == 'POST':
        if ans_form.is_valid():
            instance = content_form.save(commit=False)
            instance.updated_at = str(today)

            content_to_update.delete()
            instance.save()

        return redirect('/')

我知道删除引用关系很明显,因为删除了原始关系。有什么方法可以保持特定 Content 对象和 Saved Content 对象之间的外键关系,无论用户对内容进行了多少次更改?

提前致谢。

【问题讨论】:

  • 我不确定我是否完全理解您的问题。除了删除之外,无论用户如何更改内容,外键关系都将持续存在。但是您已经表示您了解删除方面。您能否尝试改写您的问题,以便我可以更好地帮助您?
  • 抱歉回复晚了。因此,正如问题中所写,删除现有对象是为了保存新的(编辑的)对象,对吧?所以因为删除了,外键关系也被删除了on_delete=CASCADE)。我说的对吗?
  • 但是我需要保留外键关系,不管有多少变化。例如,假设我有一个 Saved Content 对象,它引用了一个 Content 对象,如下所示:{id:1, body:'foo', created_at:2021-09-05}。现在,如果我将Content 对象更改为{id:2, body:'bar', created_at:2021-09-05},则外键关系(引用id:1)被删除,对吗?但我需要那个Saved Content 对象来维持这种关系。这是否澄清了问题?

标签: django


【解决方案1】:

更新实例时不需要删除(Django 只是更新数据库行,所以删除实例没有意义):

from django.utils import timezone

def update_content(request, content_id):
    content_to_update = Contents.objects.get(id=content_id)

    content_form = ContentsForm(request.POST, request.FILES)
    if request.method == 'POST':
        if content_form.is_valid():
            instance = content_form.save(commit=False)
            instance.updated_at = timezone.now().date()
            instance.save()
        return redirect('/')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2021-02-21
    相关资源
    最近更新 更多