python - Django Admin: OneToOne Relation as an Inline? - Stack Overflow
How to declare Django model relationships one to many, many to many and one to one; what are a Django models relationship options. Django Reverse Admin. Module that makes django admin handle OneToOneFields in a better way. A common use case for one-to-one relationships is to. 1 Django Admin Cookbook - How to do things with Django admin. 1. 2 Text and Design. 2. 3 Calculated fields. 4 Bulk and custom actions.
This means that the implicit auto incrementing integer id column that Django makes on models that inherits from django. Model will be available as a foreign key value for the same class or table. This will satisfy our use-case which could be stated as, "an employee may only have one direct manager or no manager in the case of the president, but an employee may manage many different employees".
By specifying self as the first parameter of the model. ForeignKey call, Django will set this up as a recursive relationship. Below is a ERD diagram of the recursive relationship we have defined. In the command line, within a our virtual environment of course, run the following to create the default tables which all Django apps utilize.
By default, this database is a sqlite database within the root project folder.
Do this by issuing the following commands and make sure you observe the output as shown below: Jane Doe is the president. Then John Doe has a manager role and is managed by his mother Jane Doe yes, there is clearly some nepotism here. We can test our relationship field of employee by inspecting the output of calling employee on our johnD variable: It looks like things are working as expected. Setting Up Our View In the same directory as our "hrmgmt" directory make another directory called "templates".
Then within the "templates" directory make yet another directory called "hrmgmt".
Relationships in Django models
It is within this file that we will write the code to build out our listing of employees. Copy and paste in the following code: Templates represent a blueprint for reproducible HTML that is dynamically generated based off the data that is passed to it. In our case the data being passed to our "index" template represents our list of employees.
In order to serve up our template we will need to make a couple of changes to our view function. Namely we need to import the render helper function from Django shortcuts, then instead of returning HttpResponse we will return a call to render, passing in the request object, the path to our template, and a dictionary containing the data to pass to our template. You should see the output similar to the following screenshot: You can see in the resulting "Manager" column of the table that we've successfully linked an Employee to an Employee using Django models.
Conclusion In this article we have gone over the use case for why we would implement a recursive relationship within a Django model. We walked through the code for defining such a recursive relationship as well as how to interact with the models to persist them to the database then how to retrieve them. Finally, we wrapped things up by seeing how to display the information in our database backed models in a Django template. Inlines for Inlines The default Django model administration comes with a concept of inlines.
If you have a one-to-many relationship, you can edit the parent and its children in the same form. However, you are limited in a way that you cannot have inlines under inlines at nested one-to-many relations.
Model creation, ForeignKey relations and the Django Admin
For example, you can't show models Painter, Picture, and Review in the same form if one painter may have drawn multiple pictures and each picture may have several reviews. In this article I would like to share a workaround allowing you to quickly access the inlines of an inline model.
- Additional Information
The idea is that for every inline you can provide a HTML link leading to the separate form where you can edit the related model and its own relations. It's as simple as that. For example, in the form of Painter model, you have the instances of Picture listed with specific links "Edit this Picture separately": When such a link is clicked, the administrator goes to the form of the Picture model which shows the instances of Review model listed underneath: Let's have a look, how to implement this.
First of all, I will create a gallery app and define the three models there.