Django Model field naming convention for lookup tables
You could have an abstract base model to lock in how the lookup tables all should work:

class LookupModel(models.Model):
    name = models.CharField(max_length=64)
    sort = models.IntegerField()

    class Meta:
        abstract = True
        ordering = ['sort']

    def __unicode__(self):
        return self.name


.. ditto for a DRF serializer, you just swap out which model is being connected. When you do this you cannot go the "gender__gender=gender" route though. It's a matter of how lazy you are, really (as in laziness, impatience, hubris). One advantage is that you can have a single class in the admin if you use that:

class LookupAdmin(admin.ModelAdmin):
    list_display = ('name', sort')
    ...

admin.site.register(Gender, LookupAdmin)
admin.site.register(Location, LookupAdmin)
admin.site.register(Status, LookupAdmin)


As for naming conventions, if sort is chosen/changeable and an integer I would call it position. If a string, sortkey or something like that. If automatic: Django, when sorting on foreign key with order_with_respect_to, adds the invisible column "_order", so you could do that, and find a way to set the column automatically. Or, you could sort on the automatically added auto-incrementing primary keyid-field (which I admit I've never done). I don't like implicitness though so would have a manually added column and manually set "ordering". Fewer surprises that way, laziness again.

But, and here's why I write this in 2020, long after you are hopefully done with the project you needed input on: Django 3.0 can use enums in Field.choices. So, in your case, with just a single name-field and a sort you won't change, you could forego the lookup table and instead:


LifeStatus =  models.IntegerChoices(
    'LifeStatus',
    'ALIVE MISSING DEAD UNDEAD'
)

class Human(models.Model):
    status = models.IntegerField(choices=LifeStatus.choices)
    ..


You can then do things like:

# zombieapocalypse.py

if human_looking.status == LifeStatus.UNDEAD:
    run_away()


Which IMO is very readable. Typos would also be a syntax error, bonus!

(Unfortunately this doesn't fix my problem though, I'd like a lookup table that also works like an enum...)