 <p>I'm trying to do something similar. It seems like everyone saying 'you should only have a foreign key one way' has maybe misunderstood what you're trying do.</p> <p>It's a shame the limit_choices_to={"myparent": "self"} you wanted to do doesn't work... that would have been clean and simple. Unfortunately the 'self' doesn't get evaluated and goes through as a plain string.</p> <p>I thought maybe I could do:</p> <pre><code>class MyModel(models.Model): def _get_self_pk(self): return self.pk favourite = modles.ForeignKey(limit_choices_to={'myparent__pk':_get_self_pk}) </code></pre> <p>But alas that gives an error because the function doesn't get passed a self arg :(</p> <p>It seems like the only way is to put the logic into all the forms that use this model (ie pass a queryset in to the choices for your formfield). Which is easily done, but it'd be more DRY to have this at the model level. Your overriding the save method of the model seems a good way to prevent invalid choices getting through.</p> <p><strong>Update</strong><br> See my later answer for another way <a href="http://stackoverflow.com/a/3753916/202168">http://stackoverflow.com/a/3753916/202168</a></p>