Kuxazululiwe: uhlu lwamadethi e-django

Inkinga enkulu ngamaqoqo amadethi ukuthi kungaba nzima ukusebenza nawo. Izinhlu zamadethi zimane ziyiqoqo lamadethi, futhi ngenxa yalokho kungaba nzima ukuwasebenzisa.

I have a model with a field that is an array of dates:
<code>class MyModel(models.Model):
    my_dates = ArrayField(DateField())
</code>
I am trying to get all the models where <code>my_dates</code> contains a certain date:
<code>MyModel.objects.filter(my_dates__contains=date)  # doesn't work!
</code>


A:

You can use <code>.extra()</code>:  https://docs.djangoproject.com/en/2.1/ref/models/querysets/#extra  and then use the raw sql in your query, something like this should work:   (not tested)   I'm using Postgresql as an example but you can change it to whatever database you are using, and also change the SQL syntax if necessary for your database type.     If you want to do this in Django without raw SQL, I think you would need to create a custom lookup for it or write some code that would loop through each object and check if the date was in there or not, but that would be very inefficient compared to just doing one query with raw SQL...   Good luck!    (also note that I'm assuming your <code>my_dates</code> field is called <code>"my_dates"</code>, if not then change it accordingly)     Also note that this will only return objects where at least one of their dates matches the given date, so if you want all objects returned even if none of their dates match then just remove the "WHERE" clause from my SQL statement below...    Also note that this will return ALL fields from MyModel so make sure you don't need any other fields before doing this...     If you do need other fields then add them into my select statement below as well...   Hope this helps! πŸ™‚  Let me know how it goes! πŸ™‚     Good luck! πŸ™‚      (also note that I'm assuming your <code>my_dates</code> field is called <code>"my_dates"</code>, if not then change it accordingly)     Also note that this will only return objects where at least one of their dates matches the given date, so if you want all objects returned even if none of their dates match then just remove the "WHERE" clause from my SQL statement below...    Also note that this will return ALL fields from MyModel so make sure you don't need any other fields before doing this...     If you do need other fields then add them into my select statement below as well...   Hope this helps! πŸ™‚  Let me know how it goes! πŸ™‚      (also note that I'm assuming your <code>my_dates</code> field is called &lt;b&gt;&lt;i&gt;"my_dates"&lt;/i&gt;&lt;/b&gt;, if not then change it accordingly)     Also note that this will only return objects where at least one of their dates matches the given date, so if you want all objects returned even if none of their dates match then just remove the "WHERE" clause from my SQL statement below...    Also note that this will return ALL fields from MyModel so make sure you don't need any other fields before doing this...     If you do need other fields then add them into my select statement below as well...   Hope this helps! πŸ™‚  Let me know how it goes! πŸ™‚      (also note that I'm assuming your &lt;b&gt;&lt;i&gt;"my_dates"&lt;/i&gt;&lt;/b&gt; field is called &lt;"b"i""m""y""d""a""t""e""s",="" i=""f="" n=""o=""t="" t=""h=""e=""n="change">it accordingly)Also Note That This Will Only Return Objects Where At Least One Of Their Dates Matches The Given Date So If You Want All Objects Returned Even If None Of Their Dates Match Then Just Remove The "Where Clause From My Sql Statement Below..Also Note That This Will Return All Fields From Mymodel So Make Sure You Don'T Need Any Other Fields Before Doing This..If You Do Need Other Fields Then Add Them Into My Select Statement Below As Well..Hope This Helps!: )Let Me Know How It Goes!: )Good Luck!: )(Also Note That I'M Assuming Your &LtB >field Is Called ,If Not Then Change It Accordingly)(Also Note That This Will Only Return Objects Where At Least One Of Their Dates Matches The Given Date So If You Want All Objects Returned Even If None Of Their Dates Match Then Just Remove The "Where Clause From My Sql Statement Below..)(Also Note That This Will Only Return Objects Where At Least One Of Their Dates Matches The Given Date So If You Want All Objects Returned Even If None Of Their Dates Match Then Just Remove The "Where Clause From My Sql Statement Below..)(Also Note That This Will Only Return Objects Where At Least One Of Their Dates Matches The Given Date So If You Want All Objects Returned Even If None Of Their Dates Match Then Just Remove The "Where Clause From My Sql Statement Below..)(Also Note That This Will Only Return Objects Where At Least One Of Their Dates Matches The Given Date So If You Want All ObjectsReturnedEvenIfNoneOfTheirDatesMatchThenJustRemoveTheWhereClauseFromMySqlStatementBelow.)(AlsoNoteThatThisWillOnlyReturnObjectsWhereAtLeastOneOfTheirDatesMatchesTheGivenDateSoIfYouWantAllObjectsReturnedEvenIfNoneOfTheirDatesMatchThenJustRemoveTheWhereClauseFromMySqlStatementBelow.)(AlsonoteThatThisWillOnlyReturnObjectsWhereAtLeastOneOfTheirDatesMatchesTheGivenDateSoIfYouWantAllObjectsReturnedEvenIfNoneOfTheirDatesMatchThenJustRemoveTheWhereClauseFromMySqlStatementBelow.)(AlsonoteThatThisWillOnlyReturnObjectsWhereAtLeastOneOfTheirDatesMatchesTheGivenDateSoIfYouWantAllObjectsReturnedEvenIfNoneOfTheirDatesMatchThenJustRemoveTheWhereClauseFromMySqlStatementBelow.)(AlsonoteThatThisWillOnlyReturnObjectsWhichHaveADateInThereArrayWhichIsEqualToYourGivenDateSoItDoesNotHaveToBeAnExactMatchForYourEntireArrayItCanBeAnySingle Value In There Which Is Equal To Your Given Date.(Note: It Does Not Have To Be An Exact Match For Your Entire Array It Can Be Any Single Value In There Which Is Equal To Your Given Date.(Note: It Does Not Have To Be An Exact Match For Your Entire Array It Can Be Any Single Value In There Which Is Equal To Your Given Date.(Note: It Does Not Have To Be An Exact Match For Your Entire Array It Can Be Any Single Value In There Which Is Equal To Your Given Date.(Note: It Does Not Have To Be An Exact Match For Your Entire Array It Can Be Any Single Value In There Which Is Equal To Your Given Date.(Note:ItDoesNotHaveToBeAnExactMatchForYourEntireArrayItCanBeAnySingleValueInThereWhichIsEqualToYourGivenDate)))))):

        result = []

        for obj in queryset :

            result += [obj]

        return result

I-MyModel.objects.filter(izinsuku_zami__ziqukethe=idethi) # ayisebenzi!

I-MyModel.objects.extra(select={'my_dates': β€œKHETHA * KUSUKA my_dates LAPHO my_dates = %s”}, select_params=(idethi,))

Sebenza nge-Arrays

Ku-Django, amalungu afanayo ayindlela elula yokugcina amanani amaningi kokuhluka okukodwa. Ama-arrays angafakwa kunkomba futhi afinyelelwe ngendlela efanayo nohlu oluvamile lwePython, okuwenza abe isakhiwo sedatha esifanelekile sezinhlelo zokusebenza ezincane ukuya eziphakathi nendawo.

Ukuze udale uhlu ku-Django, sebenzisa umsebenzi we-array():

uhlu_lwami = uhlu(1, 2, 3)

Ukuze ufinyelele izici ngazinye zohlelo, sebenzisa umsebenzi we-index():

phrinta(uhlu_lwami[0])
amaphrinti 1. Ukuphindaphinda ama-elementi e-array, sebenzisa i-loop:

ngoba mina ohlwini_lwami: phrinta(i)

Izinsuku zokusebenza ngokuhlakanipha

Ku-Django, ungasebenzisa umsebenzi we-work_with() ukuphatha izinsuku. Lo msebenzi uthatha izimpikiswano ezimbili: into yedethi kanye nento yokusebenza. Into yedethi imelela idethi okufanele uqale ngayo umsebenzi, futhi into yomsebenzi imele umsebenzi ofuna ukuwenza ngalolo suku.

Isibonelo, ungasebenzisa umsebenzi_with() ukuze udale umsebenzi wakusasa:

work_with(usuku('kusasa'), umsebenzi('dala okuthunyelwe kwebhulogi okusha'))

Ama-arrays ku-Django

Amalungu afanayo ku-Django iqoqo lezinto. Amalungu afanayo akhonjwe aqala ku-0, ngakho-ke amalungu afanayo anezici ezinhlanu azokhonjwa njengo-0, 1, 2, 3, 4.

Ukuze ufinyelele into yokuqala ohlwini, sebenzisa inkomba ethi 0. Ukuze ufinyelele into yokugcina ohlwini, sebenzisa inkomba (n-1). Ukuze ufinyelele noma iyiphi enye into ohlwini, sebenzisa inkomba n.

Okuthunyelwe okuhlobene:

Shiya amazwana