onetoonefield many foreign example python django-models django-admin

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.



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:


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)