python - many - foreign key django example
¿Cómo se especifica un valor predeterminado para un modelo de Django ForeignKey o un campo AdminModel? (13)
Aquí hay una solución que funcionará en Django 1.7. En lugar de proporcionar el valor predeterminado en la definición de 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)
¿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.
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 "
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 dinámico pk.
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 ))
Esta es una ligera modificación a la respuesta de . 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)
He hecho esto de manera similar a @o_c, pero prefiero usar get_or_create
de solo 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)
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 entero
También puede utilizar un llamable que puede resolverse 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:
- https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey (django docs)
- https://code.djangoproject.com/ticket/6445 (por qué fallan los lambdas)
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)
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)
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.
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) )
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)