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.

38voto

Daniel Magnusson Punkte 9281
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) )

17voto

Für django 1.7 oder höher,

Erstellen Sie einfach ein ForeignKey-Objekt und speichern Sie es. Der Wert "default" kann die ID des Objekts sein, das standardmäßig verknüpft werden soll.

Zum Beispiel,

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

11voto

o_c Punkte 3275

Hier ist eine Lösung, die in Django 1.7 funktionieren wird. Anstatt den Standardwert bei der Felddefinition anzugeben, setzen Sie ihn als null-fähig, aber überschreiben Sie die 'save'-Funktion, um ihn beim ersten Mal zu füllen (solange er null ist):

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)

7voto

Max Malysh Punkte 25480

Ich habe das ähnlich gemacht wie @o_c, aber ich benutze lieber get_or_create als einfach nur 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)

6voto

Steef Punkte 30321

Wenn Sie die Entwicklungsversion von Django verwenden, können Sie die formfield_for_foreignkey() Methode auf Ihrer AdminModel um einen Standardwert festzulegen.

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