ChatGPT解决这个技术问题 Extra ChatGPT

Can I make the foreign key field optional in Django model

I have this code

subject      = models.ForeignKey(subjects)
location     = models.ForeignKey(location)
publisher    =  models.ForeignKey(publisher)

There its not always possible that I have three values of books. so sometimes if I don't know subject or location, or publisher. Then I want to keep them empty

But if I have then I need select box to select. is it possible like that


a
akki

Sure, just add blank=True, null=True for each field that you want to remain optional like

subject = models.ForeignKey(subjects, blank=True, null=True)

Are both needed? What would be the downsides of just using null=True ?
@WardC The combo of the two is so frequent because typically if you're going to allow a field to be blank in your form, you're going to also need your database to allow NULL values for that field. The exception is CharFields and TextFields, which in Django are never saved as NULL. Blank values are stored in the DB as an empty string ('').
@Ward, both are not needed. It is sufficient to just use null=True.
blank=True is important for form validation. It will allow an empty string as user input in this field. null=True will allow NULL value in the database column.
Is something else required if you originally didn't have blank=True, null=True but do now with the migrations applied? I have this situation and while the schema looks good, the admin form won't allow a blank. Other FKs that allowed blanks originally work though and I don't see the difference.
M
Muhammad Zubair

In order to accomplish this, the on_delete argument is necessary along with blank=True and null=True, and it would be better if you do it this way.

subject = models.ForeignKey(subjects, on_delete=models.SET_NULL, blank=True, null=True)

M
MD SHAYON

null=True

subject=models.ForeignKey(subjects, on_delete=models.CASCADE, default=None, blank=True, null=True)

Field.null

If True, Django will store empty values as NULL in the database. Default is False.

Avoid using null on string-based fields such as CharField and TextField. If a string-based field has null=True, that means it has two possible values for “no data”: NULL, and the empty string. In most cases, it’s redundant to have two possible values for “no data;” the Django convention is to use the empty string, not NULL. One exception is when a CharField has both unique=True and blank=True set. In this situation, null=True is required to avoid unique constraint violations when saving multiple objects with blank values.