2009-06-02 123 views

回答

25
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)) 
+0

你這篇文章的同一個人?如果不是,請考慮添加鏈接。 http://djangodays.com/2009/05/11/django-foreign-key-default-value-example/ – Paolo 2013-01-29 16:48:21

+0

在模型中使用默認值的符號名稱是很常見的用法。我不記得該網站,但將片段更改爲更短的模式。 – 2013-02-03 02:34:56

+0

這應該是被接受的答案。 – dhilipsiva 2014-12-29 04:21:59

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一起工作。

-2
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) 
0
def get_user_default_id(): 
    return 1 

created_by = models.ForeignKey(User, default=get_user_default_id) 
7

這裏是一個將在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) 
2

我做這個類似於@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) 
1

這是對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) 
5

Django的1.7或更高版本,

只需創建一個ForeignKey的對象,並將其保存。 「默認」值可以是默認應該鏈接的對象的ID。

例如,

created_by = models.ForeignKey(User, default=1) 
相關問題