34 Stimmen

Wie kann man einen Standard für ein Django ForeignKey Model oder AdminModel Feld festlegen?

Wie kann ich einen Standardwert für ein ForeignKey-Feld in einem django Model oder AdminModel festlegen?

Etwa so (aber das funktioniert natürlich nicht)...

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

Ich weiß, dass ich es in der Ansicht "austricksen" kann, aber in Bezug auf das AdminModel scheint es nicht möglich zu sein.

2voto

LennyLip Punkte 1512

Wie für mich, für Django 1.7 seine Arbeit, nur pk:

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

aber bedenken Sie, dass die Migration wie folgt aussieht

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

Ich glaube also nicht, dass es mit dynamischen Benutzer-PKs funktioniert.

1voto

Philippos Punkte 103
def get_user_default_id():
    return 1

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

1voto

Andrew Simpson Punkte 21

Dies ist eine leichte Änderung der Antwort von o_c . Damit sollten Sie sich einen Treffer in der Datenbank ersparen. Beachten Sie, dass ich in der Speichermethode self.a_id = 1 anstelle von self.a = Foo.objects.get(id=1) verwende. Dies hat den gleichen Effekt, ohne dass Sie Foo abfragen müssen.

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)

1voto

Rune Kaagaard Punkte 6296

Bei Django >= 1.7 können Sie den Standard für ein ForeignKey-Feld auf zwei verschiedene Arten festlegen:

1) Direkt als ganze Zahl

DEFAULT_CREATED_BY_USER = 42

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

2) Als Nicht-Lambda-Aufrufer, der eine ganze Zahl zurückgibt

Sie können auch eine Callable verwenden, die in einen vollständigen Modulpfad aufgelöst werden kann. Dies bedeutet, dass Lambdas nicht funktionieren. Aber dies wird:

def default_created_by_user():
    return 42

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

Referenzen:

0voto

Kedar Jathar Punkte 61

Verwenden Sie anstelle der Lambda-Funktion eine Teilfunktion. Lambda-Funktion ist keine Serialisierung und gibt daher Fehler in Migrationen.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X