如何在django Model或AdminModel的ForeignKey字段上設置默認值?如何爲Django ForeignKey Model或AdminModel字段指定默認值?
像這樣的東西(但當然這不工作)...
created_by = models.ForeignKey(User, default=request.user)
我知道我可以「絕招」它的觀點,但在AdminModel方面,它似乎並不可能。
如何在django Model或AdminModel的ForeignKey字段上設置默認值?如何爲Django ForeignKey Model或AdminModel字段指定默認值?
像這樣的東西(但當然這不工作)...
created_by = models.ForeignKey(User, default=request.user)
我知道我可以「絕招」它的觀點,但在AdminModel方面,它似乎並不可能。
如果您使用Django的開發版本,您可以在AdminModel
上實現formfield_for_foreignkey()
方法來設置默認值。
class Foo(models.Model):
a = models.CharField(max_length=42)
class Bar(models.Model):
b = models.CharField(max_length=42)
a = models.ForeignKey(Foo, default=lambda: Foo.objects.get(id=1))
至於我,Django的1.7的工作,只是PK:
category = models.ForeignKey(Category, editable=False, default=1)
,但要記住,遷移看起來像
migrations.AlterField(
model_name='item',
name='category',
field=models.ForeignKey(default=1, editable=False, to='item.Category'),
preserve_default=True,
),
所以,我不認爲它將與動態用戶PK一起工作。
class table1(models.Model):
id = models.AutoField(primary_key=True)
agentname = models.CharField(max_length=20)
class table1(models.Model):
id = models.AutoField(primary_key=True)
lastname = models.CharField(max_length=20)
table1 = models.ForeignKey(Property)
def get_user_default_id():
return 1
created_by = models.ForeignKey(User, default=get_user_default_id)
這裏是一個將在Django 1.7工作的解決方案。 而是在字段定義提供了默認的,將其設置爲空能,但在此改變「保存」功能,以填補它的第一次(當它爲空):
class Foo(models.Model):
a = models.CharField(max_length=42)
class Bar(models.Model):
b = models.CharField(max_length=42)
a = models.ForeignKey(Foo, null=True)
def save(self, *args, **kwargs):
if self.a is None: # Set default reference
self.a = Foo.objects.get(id=1)
super(Bar, self).save(*args, **kwargs)
我做這個類似於@o_c,但我寧願使用get_or_create
而不僅僅是簡單的pk
。
class UserSettings(models.Model):
name = models.CharField(max_length=64, unique=True)
# ... some other fields
@staticmethod
def get_default_user_settings():
user_settings, created = UserSettings.objects.get_or_create(
name = 'Default settings'
)
return user_settings
class SiteUser(...):
# ... some other fields
user_settings = models.ForeignKey(
to=UserSettings,
on_delete=models.SET_NULL,
null=True
)
def save(self, *args, **kwargs):
if self.user_settings is None:
self.user_settings = UserSettings.get_default_params()
super(SiteUser, self).save(*args, **kwargs)
這是對o_c的回答的輕微修改。它應該爲你節省一筆數據庫。注意在save方法中,我使用self.a_id = 1而不是self.a = Foo.objects.get(id = 1)。它具有相同的效果,而不必查詢Foo。
class Foo(models.Model):
a = models.CharField(max_length=42)
class Bar(models.Model):
b = models.CharField(max_length=42)
a = models.ForeignKey(Foo, null=True)
def save(self, *args, **kwargs):
if self.a is None: # Set default reference
self.a_id = 1
super(Bar, self).save(*args, **kwargs)
Django的1.7或更高版本,
只需創建一個ForeignKey的對象,並將其保存。 「默認」值可以是默認應該鏈接的對象的ID。
例如,
created_by = models.ForeignKey(User, default=1)
你這篇文章的同一個人?如果不是,請考慮添加鏈接。 http://djangodays.com/2009/05/11/django-foreign-key-default-value-example/ – Paolo 2013-01-29 16:48:21
在模型中使用默認值的符號名稱是很常見的用法。我不記得該網站,但將片段更改爲更短的模式。 – 2013-02-03 02:34:56
這應該是被接受的答案。 – dhilipsiva 2014-12-29 04:21:59