¿Cómo se especifica un valor predeterminado para un modelo de Django ForeignKey o un campo AdminModel?

¿Cómo puedo establecer un valor predeterminado en un campo ForeignKey en un modelo django o en un modelo de administración?

Algo como esto (pero por supuesto esto no funciona) …

created_by = models.ForeignKey(User, default=request.user) 

Sé que puedo ‘engañarlo’ en la vista, pero en términos de AdminModel no parece posible.

 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) ) 

Aquí hay una solución que funcionará en Django 1.7. En lugar de proporcionar el valor predeterminado en la definición del campo, configúrelo como nulo, pero anule la función ‘guardar’ para llenarlo la primera vez (mientras que es nulo):

 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) 

Para django 1.7 o superior,

Solo crea un objeto ForeignKey y guárdalo. El valor “predeterminado” puede ser el id del objeto que debería estar vinculado de forma predeterminada.

Por ejemplo,

 created_by = models.ForeignKey(User, default=1) 

Si está utilizando la versión de desarrollo de Django, puede implementar el método formfield_for_foreignkey() en su AdminModel para establecer un valor predeterminado.

He hecho esto de manera similar a @o_c, pero prefiero usar get_or_create de simplemente 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) 
 def get_user_default_id(): return 1 created_by = models.ForeignKey(User, default=get_user_default_id) 

En cuanto a mí, para Django 1.7 su trabajo, solo pk:

category = models.ForeignKey(Category, editable=False, default=1)

pero recuerda, que la migración parece

 migrations.AlterField( model_name='item', name='category', field=models.ForeignKey(default=1, editable=False, to='item.Category'), preserve_default=True, ), 

Entonces, no creo que sea trabajar con el usuario dynamic pk.

Esta es una ligera modificación a la respuesta de o_c . Debería ahorrarte un hit en la base de datos. Note que en el método de guardar uso self.a_id = 1 en lugar de self.a = Foo.objects.get (id = 1). Tiene el mismo efecto sin tener que consultar a 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) 

Para Django> = 1.7, puede establecer el valor predeterminado para un campo ForeignKey de dos maneras diferentes:

1) Directamente como un entero

 DEFAULT_CREATED_BY_USER = 42 class MyModel(Model): created_by = models.ForeignKey(User, default=DEFAULT_CREATED_BY_USER) 

2) Como un invocable no amplamable que devuelve un número entero

También puede utilizar un llamable que se puede resolver en una ruta de módulo completa. Esto significa que las lambdas no funcionan. Pero esto va a:

 def default_created_by_user(): return 42 class MyModel(Model): created_by = models.ForeignKey(User, default=default_created_by_user) 

Referencias:

En lugar de la función lambda use la función parcial. La función Lambda no es serialización y por lo tanto da error en las migraciones.

 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=partial(Foo.objects.get, id=1 )) 

Debe tener configuraciones relacionadas con la configuración. AUTH_USER_MODEL en el archivo settings.py.

Puedes mirar en el siguiente documento:

https://docs.djangoproject.com/en/1.10/topics/auth/customizing/#substituting-a-custom-user-model

Puede anular el método get_form de su administrador modelo.

admin.py

 class YourModelAdmin(admin.ModelAdmin): def get_form(self, request, obj=None, **kwargs): form = super(YourModelAdmin, self).get_form(request, obj, **kwargs) form.base_fields['created_by'].initial = request.user return form admin.site.register(YourModel, YourModelAdmin) 
 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)