Django Model 如何复用上一个字段的值

from django.db import models
from datetime import datetime

class Coral(models.Model):

add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")
month = models????

譬如我上面这个有2个字断的值第二个字段是月份。
我在后台输入数据的时候,能不能只输入第一条add_time数据,提交之后,month自动获取add_time里面的月份,就省去了输入month数据的步骤。
记得以前好像看过写个方法还是什么的?
谢谢。

阅读 4.5k
6 个回答

感谢各位同学的回答。
但是我后面发现直接调用save方法是最方便。也容易写逻辑和方便处理其它字段,谢谢大家。

 def save(self, *args, **kwargs):
        if not self.month:
            #"通过add_time字段获取month逻辑"#
        super().save(*args, **kwargs)

add_time 这个字段是python的datetime对象,这里就可以提取出month的啊。
非要单独一个字段作记录的话,可以使用django models重新save方法实现。

你可以不储存month字段,因为add_time已经包含了月份信息。
可以定义property来获取month字端

class Coral(models.Model):
    add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")
    month = models????
    
    @property
    def month(self):
        return self.add_time.month

当然你这样做的代价就是无法直接对month字段进行sql操作了

可以试试django ModelForm 看看能不能满足你的需求

如果非要把month存在数据库里的话, 可以尝试下django的pre_save/post_save 信号, 在save之前或者之后把add_time的月份赋值给month

这个需求有多此一举的嫌疑。我想大概题主的意思是model中的字段如何使用其他字段的值进行自动填充。如果非要实现的话,可以使用signal

# models.py


class MyModel(models.Model):
    ...
    field_a = models.DateTimeField(auto_now_add=True)
    field_b = models.CharField(max_length=50, null=True, blank=True)
    ...
# signals.py

from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import MyModel


@receiver(post_save, sender=MyModel)
def reuse_myfield(sender, instance=None, created=False, **kwargs):
    if created:
        instance.field_b = str(instance.field_a.month)
        instance.save()
# apps.py

"""register you signals here"""

model设计不应该有这种冗余数据的存在。既然字段有关联,请使用ORM来代替。


如果题主只是想在admin后台中显示月份,则不需要单独设计月份,可以定制admin显示:

# admin.py

from django.contrib import admin

from .models import MyModel

class MyModelAdmin(admin.ModelAdmin):
    ...
    list_display = ['field_a' 'get_month']
    ...
    
    def get_monyh(self, obj)
        return obj.field_a.month
    get_monyh.short_description = '月份'
    get_monyh.all_tags = True


admin.site.register(MyModel, MyModelAdmin)

这样就可以在列表页面显示每个实例的月份信息了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏