2009-06-02 32 views

Respuesta

4

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.

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

¿Está el mismo tipo de este artículo? Si no es así, considere agregar el enlace. http://djangodays.com/2009/05/11/django-foreign-key-default-value-example/ – Paolo

+0

El uso de nombres de símbolos en modelos para valores predeterminados es un uso bastante común. No recuerdo el sitio, pero cambié el fragmento a un patrón más corto. –

+0

Esta debería ser la respuesta aceptada. – dhilipsiva

1

En cuanto a mí, por Django 1.7 de su trabajo, simplemente pk:

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

pero recuerda, que la migración se ve como

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

así, no creo es para trabajar con el usuario dinámico 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

Agregue algunas explicaciones al código, ¿por qué responde esto a la pregunta? – MeanGreen

0
def get_user_default_id(): 
    return 1 

created_by = models.ForeignKey(User, default=get_user_default_id) 
+0

agregue alguna descripción también. –

7

he aquí una solución que funcionará en Django 1.7. En lugar de proporcionar el valor por defecto en la definición de campo, configurarlo como nulables, pero overide la función 'salvar' a llenarlo en el primer tiempo (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) 
+0

¿Realmente necesita hacer que el campo sea nulo? Creo que el objeto aún no está guardado, es decir. todavía no tiene una identificación, no está "limpiado" a menos que pones "full_clean" antes del super (.. save ... Así que cambiaría la condición a si self.id es None: y debería funcionar sin null = True –

+0

@MilanoSlesarik puede que tenga razón. La razón por la que lo puse en primer lugar es porque era un campo nuevo que agregué a un modelo existente (con filas de registros existentes), así que tuve que permitir que fuera null –

+0

@o_c No es una buena idea que guardar (..) no se llame desde la actualización por lotes de QuerySets ... a menos que explícitamente buclee cada elemento devuelto y llame a guardar, lo que luego frustra el propósito de usar una actualización de lote en primer lugar (y los desarrolladores tienden a olvidar). – strangetimes

2

He hecho esto de manera similar a @o_c, pero prefiero usar get_or_create que 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) 
+0

Esta respuesta debería ser más alta, porque es simple e inteligente. –

1

Ésta es una ligera modificación de la respuesta de o_c. Debería salvarte un golpe en la base de datos. Observe 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) 
5

Para Django 1.7 o mayor,

Basta con crear un objeto ForeignKey y guardarlo. El valor "predeterminado" puede ser el id del objeto que se debe vincular de manera predeterminada.

Por ejemplo,

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